程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ Socket超時設置

C++ Socket超時設置

編輯:C++入門知識

用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 { 綁定成功 }

 

  轉載請注明原連接www.cnblogs.com/gaoteng/p/3767967.html 雪狼的個人博客

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved