基于tcp的服务器端/客户端(2)
本章节详细的讲解了TCP 中必要的理论知识
回声客户端问题的解决办法 这个问题其实很容易解决,因为可以提前接受数据的大小。若之前传输了20字节长的字符串,则再接收时循环调用 read 函数读取 20 个字节即可。既然有了解决办法,核心那么代码如下:
1
2//得到发送的数据大小
3str_len = write(sockfd,message,sizeof(message));
4int recv_len = 0;
5while( recv_len < str_len ) {
6 int recv_cnt += read(sockfd,recv_buf,str_len-recv_len);
7 //对方关闭了连接
8 if( recv_cnt == 0 ) {
9 break;
10 }
11 if( recv_cnt < 0 ) {
12 error_handing("read error")!
13 }
14 recv_len += recv_cnt;
15}
16message[recv_len] = '\0';
17printf("Received message: %s\n",message);
TCP 原理
TCP socket中的I/O缓冲
IO缓冲在每个TCP socket中单独存在.
IO缓冲在在创建TCP socket自动生成.
即使关闭socket 也会继续传递输出缓冲中遗留的数据.
关闭socket会丢失输入缓冲中的数据.
不会发生超过输入缓冲大小的数据传输!
write函数会在数据移到输出缓冲时返回.
1. TCP连接
3次握手(three-way handshaking)
1[SYN] SEQ:1000 ACK:NULL
2[SYN+ACK] SEQ: 2000, ACK: 1001
3[ACK] SEQ: 1001, ACK: 2001