C Socket超時設定

2022-03-13 13:03:30 字數 1655 閱讀 4891

用winsocket時,send(),recv()過程中有時由於網路狀況等原因,收發不能預期進行,可以設定收發時限:

int nnettimeout = 1000; //1秒

//傳送時限

setsockopt( socket, sol_socket, so_sndtimeo, ( char * )&nnettimeout, sizeof( int ) );

//接收時限

setsockopt( socket, sol_socket, so_rcvtimeo, ( char * )&nnettimeout, sizeof( int ) );

但是當我們的客戶端通過connect 函式連線服務端時,這時超時時間很長,那我們應該如何設定connect的超時時間呢?

查資料後發現,select方法可以查詢socket套接字的狀態。

fd_set rfd;      //

描述符集 這個將測試連線是否可用

struct timeval timeout; //

時間結構體

fd_zero($rfd);//

先清空乙個描述符集

timeout.tv_sec = 60;//

秒timeout.tv_usec = 0;//

一百萬分之一秒,微秒

u_long ul=1;//

代表非阻塞

ioctlsocket(socket,fionbio,$ul);//

設定為非阻塞連線

下面開始進行connect

connect(socket,(sockaddr*)&addrclient,sizeof(sockaddr))

fd_set(sock,&rfd);

連線之後將socket新增到描述符rfb中,這樣就可以對這個socket進行測試了。乙個描述符可以新增多個socket

下面執行select函式,進行查詢

ret = select(0, 0, &rfd, 0, &timeout);

if(ret<=0)

如果在超時時間之內連線成功

則將socket重新設定為阻塞狀態

如下ul = 0;

ioctlsocket(socket,fionbio,&ul);

下面就可以進行正常的recv與send操作了。

順便記錄下,多網絡卡傳送資料的操作。

當客戶端去主動連線服務端的時候(tcp),預設是不需要指定,本地的ip與埠的,作業系統會自動給你分配埠,然後根據路由自動選擇出口。

但是當你想主動根據不同的資料去選擇不同的網絡卡傳送時,我們應該怎麼做呢。

答案很簡單,

sockaddr_in addrself;//

本地位址

addrself.sin_addr.s_addr = inet_addr("

192.168.1.110

");//

指定網絡卡的位址

addrself.sin_family = af_inet; addrself.sin_port = htons(20000);//

本地埠

if( -1 == bind(sockclient[i],(sockaddr*)&addrself,sizeof(sockaddr)))//

把網絡卡位址強行繫結到soket

C socket 關於connect超時設定

使用阻塞的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,s...

關於CSocket類的Receive超時的問題

不錯,搜到以下內容,很多 為csocket配置time out功能 csocket操作,如send receive connect 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功...

關於CSocket類的Receive超時的問題

不錯,搜到以下內容,很多 為csocket配置time out功能 csocket操作,如send receive connect 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功...