基于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 原理

  1. TCP socket中的I/O缓冲

  2. IO缓冲在每个TCP socket中单独存在.

  3. IO缓冲在在创建TCP socket自动生成.

  4. 即使关闭socket 也会继续传递输出缓冲中遗留的数据.

  5. 关闭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

2. TCP传输

3. TCP断开