2013-05-19 107 views
0

我想使用select調用send()數據從我的寫套接字fd。我將要討論非阻塞套接字的實現。 哪個實施更好。選擇()呼叫與無限超時

while(u4BytesSent < u2BufLen) 
{ 

    i4RetVal = send(sockFd, au1Buf + u4BytesSent, (u2BufLen - u4BytesSent)); 
    if(i4RestVal == -1 && errno != EWOULDBLOCK) 
    { 
     break; 
    } 
    i4BytesSent = i4BytesSent + i4RetVal; 
} 

如果發送緩衝區變得頻繁滿了,這段代碼是否會佔用CPU?

OR

與無限的使用選擇呼叫timeout.Will選擇()與CPU拱和所有有更好的表現?

回答

1

如果發送緩衝區變得頻繁滿了,這段代碼是否會佔用CPU?

是的。它也會表現不正確(很可能是崩潰),因爲它最終會錯誤地將錯誤返回值-1添加到i4BytesSent

使用select()與無限(或至少非常長)超時應該工作正常。你的進程會休眠,直到socket上的數據可用。

鑑於你所描述的,你最好不要使用非阻塞套接字。如果你要做的只是將它們包裝在select()中,那麼無論如何都會阻止寫入操作!

+0

感謝您的回答..我不能改變套接字的模式,因爲這是一段巨大的代碼,可能會影響其他操作。我只是想知道,無限超時的select()會消耗CPU還是線程會在socket沒有準備好發送的時候進入休眠狀態() –

+0

嗯,你可以暫時將套接字設置爲阻塞這個函數,然後將它設置回來非阻塞後來......他這樣說,是的,'選擇()'應該能正常運行。 – duskwuff