在3way握手期间丢包

时间:2012-02-22 05:49:42

标签: c++ sockets tcp winsock handshake

我需要执行3way stop并等待用c ++(带winsock 2)编写的客户端和服务器应用程序之间的握手进行分配。客户端发送SYN。服务器递增客户端序列号并发送SYN-ACK。客户端递增服务器序列号并发送ACK。

为了模拟数据包丢失,客户端和服务器连接到中间路由器程序,该程序偶尔不会转发数据包,从而导致丢失。我应该如何构造我的sendto(),select(),recvfrom()语句来解决可能的丢包问题?

例如,如果SYN丢失且客户端超时,请重新发送。如果SYN-ACK丢失,客户端超时并重新发送SYN。如果ACK丢失了,我不知道该怎么办。

编辑:在我的客户端基本上是这样的:

  • 发送SYN。
  • 循环而select()语句失败并重新发送SYN
  • 接收SYN-ACK
  • 发送确认
  • 如果ACK丢失,则循环到可能重新接收SYN-ACK。

我如何知道何时停止循环?

1 个答案:

答案 0 :(得分:1)

select可用于检查何时可以无阻塞地读取套接字。

至于检查ACK所属的已发送数据包,请检查序列号。

如果在超时内没有收到ACK,则只需重新发送最后一个数据包即可。您发送的数据包类型无关紧要,如果您没有收到确认,则应重新发送。