socket通訊阻塞模式下,設定傳送和接受函式超時

2021-08-26 02:17:04 字數 1221 閱讀 4584

今天公司專案上遇到了乙個問題,就是用到socket與伺服器通訊時,接收資料會突然有一次接收不到資料。但是專案**使用阻塞程式寫的,所以程式就一直卡在接收函式不能動。開始為了解決這個問題可以說是費勁周折。先是用了定時器,但是專案**用的是多程序,要涉及到程序間通訊的問題。

後面從網上搜到了下面這一段文字,幫助了我的大忙,真是太感謝了。在阻塞狀態下,接收和傳送函式同樣可以設定接受傳送超時時間,而只要是程序不被阻塞,就有辦法解決為什麼就收不到資料的問題。

用setsockopt()來控制recv()與send()的超時

在send(),recv()過程中有時由於網路狀況等原因,收發不能預期進行,而設定收發超時控制:

在linux下需要注意的是時間的控制結構是struct timeval而並不是某一整型數,

int nnettimeout=1000;//1秒,
//設定傳送超時

setsockopt(socket,sol_socket,so_sndtimeo,(char *)&nnettimeout,sizeof(int));
//設定接收超時

setsockopt(socket,sol_socket,so_rcvtimeo,(char *)&nnettimeout,sizeof(int));
這樣做在linux環境下是不會產生效果的,須如下定義:struct timeval timeout = ;

//設定傳送超時

setsockopt(socket,sol_socket,so_sndtimeo,(char *)&timeout,sizeof(struct timeval));
//設定接收超時

setsockopt(socket,sol_socket,so_rcvtimeo,(char *)&timeout,sizeof(struct timeval));
有兩點注意就是:

1)recv ()的第四個引數需為msg_waitall,在阻塞模式下不等到指定數目的資料不會返回,除非超時時間到。還要注意的是只要設定了接收超時,在沒有 msg_waitall時也是有效的。說到底超時就是不讓你的程式老在那兒等,到一定時間進行一次返回而已。

2)即使等待超時時間值未到,但對方已經關閉了socket, 則此時recv()會立即返回,並收到多少資料返回多少資料。

socket通訊阻塞模式下,設定傳送和接受函式超時

後面從網上搜到了下面這一段文字,幫助了我的大忙,真是太感謝了。在阻塞狀態下,接收和傳送函式同樣可以設定接受傳送超時時間,而只要是程序不被阻塞,就有辦法解決為什麼就收不到資料的問題。在send recv 過程中有時由於網路狀況等原因,收發不能預期進行,而設定收發超時控制 在linux下需要注意的是時間...

socket通訊阻塞模式下,設定傳送和接受函式超時

後面從網上搜到了下面這一段文字,幫助了我的大忙,真是太感謝了。在阻塞狀態下,接收和傳送函式同樣可以設定接受傳送超時時間,而只要是程序不被阻塞,就有辦法解決為什麼就收不到資料的問題。在send recv 過程中有時由於網路狀況等原因,收發不能預期進行,而設定收發超時控制 在linux下需要注意的是時間...

socket設定為非阻塞模式

於 1,套接字的預設狀態是阻塞的。即當發出乙個不能立即完成的套接字呼叫時,該程序將被投入睡眠,等待相應操作完成。2,阻塞的套接字分為下面四類 輸入操作 包括read recv recvfrom和recvmsg。輸出操作 包括write send sendto和sendmsg。接受外來連線,accep...