美文网首页
开篇第二章--基于TCP的客户端

开篇第二章--基于TCP的客户端

作者: Jervions | 来源:发表于2016-10-27 22:19 被阅读0次

    1.TCP通信简介

    参考了《UNIX网络编程卷1》,对于TCP客户端来说,当其通过socket()获取了socket套接字值后,使用connect()进行与服务端的连接,并传入相应sockaddr_in所填写的参数,如果其返回-1,表示连接失败;返回0表示连接成功。

    2.基于Boost的TCP客户端实现

    Boost库有它自身的实现方式,其调用方式可以参考它的example,在对应的boost_1_61_0\doc\html\boost_asio\example下,有C++03/C++11的实现,在Echo文件夹下有同步客户端blocking_tcp_echo_client.cpp,这里用SocketTool.exe进行调试。

    2.1同步客户端代码

    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <boost/asio.hpp>
    
    using boost::asio::ip::tcp;
    
    enum { max_length = 1024 };
    
    int main(int argc, char* argv[])
    {
        try
        {
            boost::asio::io_service io_service;
    
            tcp::resolver resolver(io_service);
            tcp::resolver::query query(tcp::v4(), "127.0.0.1", "5566");
            tcp::resolver::iterator iterator = resolver.resolve(query);
    
            tcp::socket s(io_service);
            boost::asio::connect(s, iterator);
    
            using namespace std; // For strlen.
            std::cout << "Enter message: ";
            char request[max_length];
            std::cin.getline(request, max_length);
            size_t request_length = strlen(request);
            boost::asio::write(s, boost::asio::buffer(request, request_length));
    
            char reply[max_length];
            size_t reply_length = boost::asio::read(s,
                boost::asio::buffer(reply, request_length));
            std::cout << "Reply is: ";
            std::cout.write(reply, reply_length);
            std::cout << "\n";
        }
        catch (std::exception& e)
        {
            std::cerr << "Exception: " << e.what() << "\n";
        }
        return 0;
    }
    

    2.2 代码分析

    每个 Asio 程序都有一个 io_service 对象,它代表了操作系统的 I/O服务,并把你的程序和这些服务链接起来。
    resolver是Asio的域名解析系统,它将指定的URL和服务转化为相应的ip和port的endpoint端点;resolver::query是把消息填入队列,依据消息内容创建resolver::iterator的迭代器,由tcp::socket的构造方法创建socket对象,connect()进行连接,连接到服务端。
    读取getline()输入到服务端,等待服务端返回数据,取输入输出等长数据,进一步输出到显示屏。

    相关文章

      网友评论

          本文标题:开篇第二章--基于TCP的客户端

          本文链接:https://www.haomeiwen.com/subject/vqnluttx.html