阻止TCP-send直到ACK返回

时间:2011-08-24 13:04:29

标签: winapi sockets tcp blocking

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

将Socket设置为阻塞模式没有用,因为只要数据写入缓冲区就会返回send命令(如果我没记错的话)。有没有办法阻止发送,直到ACK被返回,或者有没有其他方法可以做到这一点而不编写我自己的TCP实现?

此致

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

peudocode ...会等到ack被接收,之后你可以调用你想要的任何功能 - 我选择了一些编组函数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)