C語言socket設定超時/setsockopt函式
阿新 • • 發佈:2019-01-26
//=======================
在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");
}
//======================
{
printf("Set Ser_RecTIMEO error !\r\n");
}
{
printf("recv timeout! %d\n",ret);//ret = -1
//continue;
} 設定接收超時成功後,若超時,返回值為ret = -1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>Linux