有時,當我嘗試連續發送一些數據包(我正在使用send()API)時收到此錯誤。現在我不知道我該怎麼做。我有這些問題: 1)我可以重新發送嗎?如果是,那麼在多少時間後我應該再試一次。是否有任何特定策略需要遵循EAGAIN錯誤:使用伯克利套接字API
2)緩衝區大小是否超出其極限是唯一原因?
3)有人可以給我一個更好的想法/代碼,如何處理這種情況。
謝謝。 Sambit。
有時,當我嘗試連續發送一些數據包(我正在使用send()API)時收到此錯誤。現在我不知道我該怎麼做。我有這些問題: 1)我可以重新發送嗎?如果是,那麼在多少時間後我應該再試一次。是否有任何特定策略需要遵循EAGAIN錯誤:使用伯克利套接字API
2)緩衝區大小是否超出其極限是唯一原因?
3)有人可以給我一個更好的想法/代碼,如何處理這種情況。
謝謝。 Sambit。
EAGAIN通常在沒有出站緩衝區空間的情況下返回。等待多久取決於底層連接的速度。正常的方法是等到select()或poll()告訴你套接字可用於寫入。如果在Linux上,請查看select_tut(2)聯機幫助頁,當然還有send(2)聯機幫助頁。
如果您希望呼叫等待直到有空間可用,您可以更改爲阻止操作(這是默認設置)。或者你可以調用select(2)來等待套接字是可寫的,然後重試。
還有一個重要的考慮因素。如果你正在發送UDP數據包,那麼請記住,沒有擁塞控制的保證,如果你通過互聯網發送數據包,你幾乎肯定會丟包,如果你試圖儘可能快地發送UDP數據包(這不一定適用於其他數據報套接字,例如Unix套接字)。
從send():「EAGAIN - 套接字被標記爲非阻塞,並且請求的操作將被阻止。」還有
When the message does not fit into the send buffer of the socket, send normally blocks, unless the socket has been placed in non-blocking I/O mode. In non-blocking mode it would return EAGAIN in this case. The select(2) call may be used to determine when it is possible to send more data.
This thread有一個使用select()來處理EAGAIN的簡單例子,接下來是關於表面下潛伏着什麼種類的驚喜的重要討論。