1. 程式人生 > >C語言socket設定超時/setsockopt函式

C語言socket設定超時/setsockopt函式

//======================= 在Windows下似乎操作比較簡單,直接呼叫winsock2.h和ws2_32.lib程式設計 #include"stdafx.h" #include"stdio.h" #include "winsock2.h" #pragmacomment(lib, "ws2_32.lib")   設定接收超時為 nNetTimeout 可採用如下方法: int nNetTimeout= 2000ms; if (SOCKET_ERROR ==  setsockopt(serSocket,SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout,sizeof(int))) 
 { 
         printf("Set Ser_RecTIMEO error !\r\n"); 
 } 
int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr*)&remoteAddr, &nAddrLen);       if(ret<0)
    {
         printf("recv timeout! %d\n",ret);//ret = -1
         //continue;
     }
設定接收超時成功後,若超時,返回值為ret =  -1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>Linux
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
而Linux下則不太一樣,timeout若仍採用int型將沒有效果。 linux下應將timeout型別改成struct timeval 注意符號: struct timevaltimeout={4,0}; //即timeout={4,0};或者timeout.tv_sec=4; 
timeout.tv_usec=0; //設定接收超時 //setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)); setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(structtimeval)); //同樣接收超時後接收返回-1 if((rec_length=recvfrom(sockfd,recbuf,MAXDATASIZE,0,(structsockaddr *)&peer,&addrlen))== -1){     printf("recvtimeout!\n"); } //======================