2

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

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

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

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

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

我怎么知道什么时候停止循环?

4

1 回答 1

1

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

至于检查ACK属于哪个发送的数据包,您检查序列号。

如果您在超时内没有收到 ACK,您只需重新发送最后一个数据包。不管你发送什么样的数据包,如果你没有收到一个ACK,你应该重新发送它。

于 2012-02-22T06:37:37.203 回答