2010-10-21 23 views
1

有時,當我嘗試連續發送一些數據包(我正在使用send()API)時收到此錯誤。現在我不知道我該怎麼做。我有這些問題: 1)我可以重新發送嗎?如果是,那麼在多少時間後我應該再試一次。是否有任何特定策略需要遵循EAGAIN錯誤:使用伯克利套接字API

2)緩衝區大小是否超出其極限是唯一原因?

3)有人可以給我一個更好的想法/代碼,如何處理這種情況。

謝謝。 Sambit。

回答

2

EAGAIN通常在沒有出站緩衝區空間的情況下返回。等待多久取決於底層連接的速度。正常的方法是等到select()或poll()告訴你套接字可用於寫入。如果在Linux上,請查看select_tut(2)聯機幫助頁,當然還有send(2)聯機幫助頁。

如果您希望呼叫等待直到有空間可用,您可以更改爲阻止操作(這是默認設置)。或者你可以調用select(2)來等待套接字是可寫的,然後重試。

還有一個重要的考慮因素。如果你正在發送UDP數據包,那麼請記住,沒有擁塞控制的保證,如果你通過互聯網發送數據包,你幾乎肯定會丟包,如果你試圖儘可能快地發送UDP數據包(這不一定適用於其他數據報套接字,例如Unix套接字)。

3

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的簡單例子,接下來是關於表面下潛伏着什麼種類的驚喜的重要討論。