使用阻塞的socket, 可以設定讀寫超時,
struct timeval tv_timeout;
tv_timeout.tv_sec = 60;
tv_timeout.tv_usec = 0;
if (setsockopt(sockfd, sol_socket, so_sndtimeo, (void *) &tv_timeout, sizeof(struct timeval)) < 0)
tv_timeout.tv_sec = 60;
tv_timeout.tv_usec = 0;
if (setsockopt(sockfd, sol_socket, so_rcvtimeo, (void *) &tv_timeout, sizeof(struct timeval)) < 0)
但是這個不會影響connect.
如何設定connect超時呢, 通過訊號alarm? 感覺不是乙個好的辦法.比較好的辦法是通過select或者poll判斷超時.
首先設定socket fd為非阻塞, connect判斷返回值, 如果返回0, 說明connect成功, 如果返回值等於-1並且錯誤的errno為einprogress時呼叫select或者poll判斷socket fd的可寫狀態, 通過select或者poll的超時設定來判斷是否超時.
man page是這麼寫的
einprogress
the socket is non-blocking and the connection cannot be com-
pleted immediately. it is possible to select(2) or poll(2) for
completion by selecting the socket for writing. after select(2)
indicates writability, use getsockopt(2) to read the so_error
option at level sol_socket to determine whether connect() com-
pleted successfully (so_error is zero) or unsuccessfully
(so_error is one of the usual error codes listed here, explain-
ing the reason for the failure).
Linux socket非阻塞connect方法
socket non blocking mode connect 對於面向連線的socket型別 sock stream,sock seqpacket 在讀寫資料之前必須建立連線,connect 函式用於完成面向連線的socket的建鏈過程,對於tcp,也就是三次握手過程。connect 函式 標頭...
關於CSocket類的Receive超時的問題
不錯,搜到以下內容,很多 為csocket配置time out功能 csocket操作,如send receive connect 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功...
關於CSocket類的Receive超時的問題
不錯,搜到以下內容,很多 為csocket配置time out功能 csocket操作,如send receive connect 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功...