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丢失。
如何知道何时停止循环?
看起来这以前问一个问题: http://stackoverflow.com/questions/1460640/doubt-in-three-way-handshake-in-tcp-and-unix-listen-function – DRobinson 2012-02-22 05:52:44
据我所知, SYN-ACK将被重发,然后ACK将重新发送,但是如何使用select()检查它?我必须循环recvfrom()并检查它是否是相同的SYN-ACK? – 2012-02-22 05:56:57
在TCP中,您无法控制SYN和ACK。你可以做的唯一事情就是将套接字置于非阻塞模式,所以'connect()'异步工作,然后使用'select()'的超时功能来等待连接建立。如果'select()'超时,关闭套接字并重新开始。 – 2012-02-22 06:38:10