用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 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功...