我在客戶端和服務器之間實現一個基本的文件傳輸系統,用於使用UDP的練習。我試圖實現一些基本的可靠性。確認沒有信號的UDP包?
現在我的服務器發送一大塊數據,並等待一個確認信號,說明塊已收到。有沒有辦法在不使用信號的情況下發送更強大的消息?
理想情況下,我想只能使用sendto和recvfrom,但在沒有收到數據包的情況下,recvfrom就會掛起。
這是可能的,還是我需要使用信號?
我在客戶端和服務器之間實現一個基本的文件傳輸系統,用於使用UDP的練習。我試圖實現一些基本的可靠性。確認沒有信號的UDP包?
現在我的服務器發送一大塊數據,並等待一個確認信號,說明塊已收到。有沒有辦法在不使用信號的情況下發送更強大的消息?
理想情況下,我想只能使用sendto和recvfrom,但在沒有收到數據包的情況下,recvfrom就會掛起。
這是可能的,還是我需要使用信號?
您可以使用select()
來了解何時需要從您從客戶端收到ACK的套接字讀取輸入。然後,您可以指定一個超時,之後即使沒有可用輸入,select()
也會返回。這使您有機會保持服務器「活着」。
您還可以使用非阻塞I/O,這樣可以提供更大的靈活性,但由於您需要注意不要「繁忙循環」並消耗太多CPU,因此會更難一些。
使用setsockopt()和SO_TIMEOUT設置套接字讀取超時。
錯誤,select()也是'busy loop'的解決方案。 – EJP