2011-08-24 181 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)