2011-10-20 57 views
0

我在客戶端和服務器之間實現一個基本的文件傳輸系統,用於使用UDP的練習。我試圖實現一些基本的可靠性。確認沒有信號的UDP包?

現在我的服務器發送一大塊數據,並等待一個確認信號,說明塊已收到。有沒有辦法在不使用信號的情況下發送更強大的消息?

理想情況下,我想只能使用sendto和recvfrom,但在沒有收到數據包的情況下,recvfrom就會掛起。

這是可能的,還是我需要使用信號?

回答

3

您可以使用select()來了解何時需要從您從客戶端收到ACK的套接字讀取輸入。然後,您可以指定一個超時,之後即使沒有可用輸入,select()也會返回。這使您有機會保持服務器「活着」。

您還可以使用非阻塞I/O,這樣可以提供更大的靈活性,但由於您需要注意不要「繁忙循環」並消耗太多CPU,因此會更難一些。

+0

錯誤,select()也是'busy loop'的解決方案。 – EJP

1

使用setsockopt()和SO_TIMEOUT設置套接字讀取超時。