我正在編程一個客戶端應用程序發送TCP/IP數據包到服務器。由於超時問題,我希望在返回ACK包後立即啓動計時器(因此,在包未到達服務器時不會有超時)。我想用winapi。阻止TCP發送,直到ACK返回
將Socket設置爲阻塞模式並沒有幫助,因爲只要數據寫入緩衝區,發送命令就會返回(如果我沒有弄錯)。有沒有辦法阻止發送,直到ACK被返回,還是有沒有其他的方式來做到這一點,而不寫我自己的TCP執行?
Regards
我正在編程一個客戶端應用程序發送TCP/IP數據包到服務器。由於超時問題,我希望在返回ACK包後立即啓動計時器(因此,在包未到達服務器時不會有超時)。我想用winapi。阻止TCP發送,直到ACK返回
將Socket設置爲阻塞模式並沒有幫助,因爲只要數據寫入緩衝區,發送命令就會返回(如果我沒有弄錯)。有沒有辦法阻止發送,直到ACK被返回,還是有沒有其他的方式來做到這一點,而不寫我自己的TCP執行?
Regards
這聽起來像你想要做最低的實現來實現你的目標。在這種情況下,您應該將您的套接字設置爲阻塞狀態,並且在發送之後阻塞發送所有數據,然後調用recv,這樣會阻塞,直到收到ACK數據包或者服務器端關閉或中止連接。
如果您想要進一步實現您的實現,您必須以支持異步通信的方式構建您的客戶端應用程序。有一些技術具有不同程度的複雜性;使用select()簡單事件模型輪詢使用WSASelectEvent/WSAWaitForMultipleEvents具有挑戰性,而IOCompletionPort模型非常複雜。
只有當收到來自服務器的某些實際數據(或連接關閉)時,recv()'纔會在接收到裸ACK數據包時解除阻塞。 – caf
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)
使應用程序級別ack mechansim。 – Simon
設置套接字阻塞和調用recv也許? – BlackBear
@Simon如果我不需要更改服務器代碼(在我的情況中不那麼簡單,服務器是嵌入式系統),那將是非常棒的。 –