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