文章目录
一、源代码说明
freecplus是一个Linux系统下的C/C++开源框架,源代码请前往C语言技术网(www.freecplus.net)下载。
本文介绍的是freecplus框架的TCP/IP协议网络通信的函数和类。
函数和类的声明文件是freecplus/_freecplus.h。
函数和类的定义文件是freecplus/_freecplus.cpp。
示例程序位于freecplus/demo目录中。
编译规则文件是freecplus/demo/makefile。
二、概述
freecplus框架对socket通信封装如下:
CTcpClient类:socket通信的客户端类。
CTcpServer类:socket通信的服务端类。
TcpRead函数:接收socket的对端发送过来的数据。
TcpWrite函数:向socket的对端发送数据。
Readn函数:从已经准备好的socket中读取数据。
Writen函数:向已经准备好的socket中写入数据。
在阅读本文章之前,您必须熟悉TCP/IP协议和socket通信,本文是介绍的是freecplus框架中网络通信的类和函数的用法,不会介绍网络通信的基础知识。
三、通信的报文格式
freecplus框架的socket通信报文格式如下:
报文长度+报文内容
报文长度为4字节的整数,表示的是报文内容的长度,而不是整个TCP报文的长度,整个TCP报文的长度是报文内容的长度+4。
报文长度是4字节的整数,即int,是以二进制流的方式写入socket,不是ascii码。
采用CTcpClient类、CTcpServer类、TcpRead函数和TcpWrite函数进行socket通信,可以避免TCP报文粘包的问题。
四、socket通信客户端
socket通信的客户端封装在CTcpClient类中。
类的声明:
// socket通信的客户端类
class CTcpClient
{
public:
int m_sockfd; // 客户端的socket.
char m_ip[21]; // 服务端的ip地址。
int m_port; // 与服务端通信的端口。
bool m_state; // 与服务端的socket连接状态。
bool m_btimeout; // 调用Read和Write方法时,失败的原因是否是超时:true-未超时,false-已超时。
int m_buflen; // 调用Read方法后,接收到的报文的大小,单位:字节。
CTcpClient(); // 构造函数。
// 向服务端发起连接请求。
// ip:服务端的ip地址。
// port:服务端监听的端口。
// 返回值:true-成功;false-失败。
bool ConnectToServer(const char *ip,const int port);
// 接收服务端发送过来的数据。
// buffer:接收数据缓冲区的地址,数据的长度存放在m_buflen成员变量中。
// itimeout:等待数据的超时时间,单位:秒,缺省值是0-无限等待。
// 返回值:true-成功;false-失败,失败有两种情况:1)等待超时,成员变量m_btimeout的值被设置为true;2)socket连接已不可用。
bool Read(char *buffer,const int itimeout=0);
// 向服务端发送数据。
// buffer:待发送数据缓冲区的地址。
// ibuflen:待发送数据的大小,单位:字节,缺省值为0,如果发送的是ascii字符串,ibuflen取0,如果是二进制流数据,ibuflen为二进制数据块的大小。
// 返回值:true-成功;false-失败,如果失败,表示socket连接已不可用。
bool Write(const char *buffer,const int ibuflen=0);
// 断开与服务端的连接
void Close();
~CTcpClient(); // 析构函数自动关闭socket,释放资源。
};
五、socket通信的服务端
socket通信的服务端封装在CTcpServer类中。
类的声明:
// socket通信的服务端类
class CTcpServer