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

2016-10-27  本文已影响0人  Jervions

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()输入到服务端,等待服务端返回数据,取输入输出等长数据,进一步输出到显示屏。

上一篇下一篇

猜你喜欢

热点阅读