C++ Socket超時設置

http://www.cnblogs.com/gaoteng/p/3767967.htmlhtml

 

用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
   {
         綁定成功
   }
相關文章
相關標籤/搜索