TCP服务器和客户端的简单编写
TCP简介
- TCP是什么
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。 - TCP的三次握手和四次挥手
TCP协议使用严格的应答机制来确保可靠性,在建立连接时进行三次握手,断开链接时进行四次挥手。
三次握手如下:
client---------------SYN=1------------------>server
server--------------SYN=1,ACK=1------->client
client----------------ACK=1------------------>server
四次挥手如下:
client---------------FIN------------------------>server
server--------------ACK---------------------->client
server--------------FIN------------------------>client
client----------------ACK---------------------->server
TCP服务器的设计流程
服务器编写五步:
- 建立套接字
sfd = socket(AF_INET,SOCK_STREAM,0);
- 绑定IP地址与端口号
ret = bind(sfd,(const struct sockaddr)&src,sizeof(src));
- 创建监听队列,让套接字进入被动监听状态
ret = lisent(sfd,BACKLOG);
- 接受连接,产生新的套接字
ret = accept(sfd,(struct sockaddr *)&cli,&clilen);
- 数据读写
recv_byte = recv(cfd,buf,sizeof(buf),0); send_bytes = send(cfd,buf,recv_byte,0);
客户端:
- 建立套接字
sfd = socket(AF_INET,SOCK_STREAM,0);
- 连接服务器发出请求
ret = connect(sfd,(struct sockaddr *)ser,sizeof(ser));
- 数据收发和服务器相同recv_byte = recv(cfd,buf,sizeof(buf),0); send_bytes = send(cfd,buf,recv_byte,0);`
只能接纳一个客户的服务器和客户端代码实现
服务器:
客户端:
多个客户端的并发服务器
使用多进程
- 父进程负责建立连接,子进程负责与客户端的数据接收发送。每连接一个客户端创建一个新的子进程。还要注意当客户端断开连接后僵尸子进程的回收。可以使用信号进行异步处理,杀死子进程。
- 不足之处在于每个进程都需要单独分配内存空间,消耗更多资源。
- 使用signal函数回收僵尸进程
signal(SIGCHLD,signal_hander) == STG_ERR
;zom_pid = wait(NULL);
创建进程和父子进程分工合作:
使用信号回收子进程:
使用多线程
- 每当有一个客户端发送连接请求,就创建一个子线程,使用线程可以节约资源,减少复杂的进程间的通讯。
- 可以用子线程分离函数
pthread_detach(pthread_thread);
释放子线程资源。
SELECT多路复用IO
未完待续。。。。。