2012-02-22 16 views
2

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

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

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

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

  • 发送SYN。
  • 循环,而选择()语句失败并重新发送SYN
  • 收到SYN-ACK
  • 发送ACK
  • 河套可能再次收到SYN-ACK如果ACK丢失。

如何知道何时停止循环?

+1

看起来这以前问一个问题: http://stackoverflow.com/questions/1460640/doubt-in-three-way-handshake-in-tcp-and-unix-listen-function – DRobinson 2012-02-22 05:52:44

+0

据我所知, SYN-ACK将被重发,然后ACK将重新发送,但是如何使用select()检查它?我必须循环recvfrom()并检查它是否是相同的SYN-ACK? – 2012-02-22 05:56:57

+0

在TCP中,您无法控制SYN和ACK。你可以做的唯一事情就是将套接字置于非阻塞模式,所以'connect()'异步工作,然后使用'select()'的超时功能来等待连接建立。如果'select()'超时,关闭套接字并重新开始。 – 2012-02-22 06:38:10

回答

1

select可用于检查何时可以在不阻塞的情况下读取套接字。

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

如果您在超时时间内没有收到ACK,您可以简单地重新发送最后一个数据包。无论发送什么类型的数据包都无关紧要,如果您没有收到ACK,应重新发送。