2011-08-24 183 views
0

我正在编程一个客户端应用程序发送TCP/IP数据包到服务器。由于超时问题,我希望在返回ACK包后立即启动计时器(因此,在包未到达服务器时不会有超时)。我想用winapi。阻止TCP发送,直到ACK返回

将Socket设置为阻塞模式并没有帮助,因为只要数据写入缓冲区,发送命令就会返回(如果我没有弄错)。有没有办法阻止发送,直到ACK被返回,还是有没有其他的方式来做到这一点,而不写我自己的TCP执行?

Regards

+2

使应用程序级别ack mechansim。 – Simon

+0

设置套接字阻塞和调用recv也许? – BlackBear

+0

@Simon如果我不需要更改服务器代码(在我的情况中不那么简单,服务器是嵌入式系统),那将是非常棒的。 –

回答

0

这听起来像你想要做最低的实现来实现你的目标。在这种情况下,您应该将您的套接字设置为阻塞状态,并且在发送之后阻塞发送所有数据,然后调用recv,这样会阻塞,直到收到ACK数据包或者服务器端关闭或中止连接。

如果您想要进一步实现您的实现,您必须以支持异步通信的方式构建您的客户端应用程序。有一些技术具有不同程度的复杂性;使用select()简单事件模型轮询使用WSASelectEvent/WSAWaitForMultipleEvents具有挑战性,而IOCompletionPort模型非常复杂。

+1

只有当收到来自服务器的某些实际数据(或连接关闭)时,recv()'才会在接收到裸ACK数据包时解除阻塞。 – caf

0

peudocode ...等到ack被接收,之后你可以调用你想要的任何函数--i选择一些组成函数send_data ..然后在接收到ack后通过套接字发送信息。

data = '' 
while True 
    readable, writable, errors = select([socket]) 
     if socket in readble 
      data += recv(socket) 
      if is_ack(data) 
       timer.start() #not sure why you want this 
       break 
send_data(socket)