标签:socket 小谈 int TCP 线程 sockfd 服务端 客户端
一、TCP通信网络中可能用到的接口:
1.创建套接字
int socket(int domain, int type, int protocol);
2.绑定地址信息和端口
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
3.开始监听:告诉操作系统可以开始与用户进行三次握手连接;每一个客户端到来都会为它创建一个新的socket与它单独通信,为了防止而已连接攻击服务器设置backlog来限制最大并发连接数。在内核中已经创建连接队列和未完成的对列,通过最大节点数量来限制。
int listen(int sockfd, int backlog);
4.获取上一步已完成连接的客户端新建socket。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
sockfd:监听socket。仅用于接收第一次请求。在后续通信中它不再使用。与客户端进行通信。
5.收发数据
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
recv返回值为0,不是没有数据,而是断开连接。
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
6.客户端连接请求:
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
二、TCP协议通信注意事项:
由于基本的TCP服务端程序同时只能与一个客户端进行通信:因为服务器并不知道客户端数据什么时候到来,因此服务端程序流程只能写死,而写死可能会导致阻塞。
所以就使用多进程/多线程来处理。
在多进程tcp服务端程序:一个子进程处理一个客户端,实现多个客户端同时处理。父进程必须关闭socket,处理僵尸子进程问题。设置信号。
在多线程tcp服务端程序:一个子线程处理一个客户端,实现多个客户端的同时处理。主线程不能退出即不能关闭socket:线程间共享代码段,数据段。同一线程共享文件描述符表。
三、代码实现:
1.实现TCP通信所需的所有函数的接口类:
2.实现线程池版本的服务端:
3.客户端程序:
4.运行结果:
4.1服务端显示:
4.2客户端jack:
4.3客户端小明:
4.4客户端peter:
珍&源码
标签:socket,小谈,int,TCP,线程,sockfd,服务端,客户端 来源: https://blog.csdn.net/IT_xiaoQ/article/details/90607592
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。