C/C 套接字通信类的封装
扫描二维码
随时随地手机看文章
1. 基于 C 语言的封装
基于 TCP 的套接字通信分为两部分:服务器端通信和客户端通信。我们只要掌握了通信流程,封装出对应的功能函数也就不在话下了,先来回顾一下通信流程:服务器端
- 创建用于监听的套接字
- 将用于监听的套接字和本地的 IP 以及端口进行绑定
- 启动监听
- 等待并接受新的客户端连接,连接建立得到用于通信的套接字和客户端的 IP、端口信息
- 使用得到的通信的套接字和客户端通信(接收和发送数据)
- 通信结束,关闭套接字(监听 通信)
客户端
- 创建用于通信的套接字
- 使用服务器端绑定的 IP 和端口连接服务器
- 使用通信的套接字和服务器通信(发送和接收数据)
- 通信结束,关闭套接字(通信)
1.1 函数声明
通过通信流程可以看出服务器和客户端有些操作步骤是相同的,因此封装的功能函数是可以共用的,相关的通信函数声明如下:///////////////////////////////////////////////////
//////////////////// 服务器 ///////////////////////
///////////////////////////////////////////////////
int bindSocket(int lfd, unsigned short port);
int setListen(int lfd);
int acceptConn(int lfd, struct sockaddr_in *addr);
///////////////////////////////////////////////////
//////////////////// 客户端 ///////////////////////
///////////////////////////////////////////////////
int connectToHost(int fd, const char* ip, unsigned short port);
///////////////////////////////////////////////////
///////////////////// 共用 ////////////////////////
///////////////////////////////////////////////////
int createSocket();
int sendMsg(int fd, const char* msg);
int recvMsg(int fd, char* msg, int size);
int closeSocket(int fd);
int readn(int fd, char* buf, int size);
int writen(int fd, const char* msg, int size);
关于函数 readn()
和 writen()
的作用请参考TCP数据粘包的处理1.2 函数定义
// 创建监套接字
int createSocket()
{
int fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd == -1)
{
perror("socket");
return -1;
}
printf("套接字创建成功, fd=%d\n", fd);
return fd;
}
// 绑定本地的IP和端口
int bindSocket(int lfd, unsigned short port)
{
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);
saddr.sin_addr.s_addr = INADDR_ANY; // 0 = 0.0.0.0
int ret = bind(lfd, (struct sockaddr*)