关于 socket阻塞的问题,大哥们啊,求求你们了啊
我建的socket是阻塞的,当服务端没有返信时,我的程序就停在recv不动了,然后我设置了
int TimeOut=6000;//设置接收超时6秒
if(::setsockopt(sockClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
return
} ;
过6秒后就跳过了recv语句了,请问setsockopt()函数就是这样当recv卡在那里的时候,超过时间退出的吗?
因为我用的recv,是用while()循环接收的,要真的跳出循环还要设置一个时间开关,到时间就跳出循环吗?以下代码请过目
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
int TimeOut=6000;//设置接收超时6秒
if(::setsockopt(sockClient,SOL_SOCKET,SO_RCVTIMEO,(char&TimeOut,sizeof (TimeOut))==SOCKET_ERROR){
return ;
}
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char sentBuf[20]="54156231";
send(sockClient, sentBuf,strlen(sentBuf)+1,0);
DWORD dwBegin = ::GetTickCount();
DWORD dwNow = dwBegin;
const dwMaxTime = 6000; //最大超时,单位为毫秒
while(dwNow-dwBegin<dwMaxTime)
{
char recvBuf[100];
memset( recvBuf, 0x00, sizeof(recvBuf));
int ret;
ret=recv(sockClient,recvBuf,100,0);
dwNow = ::GetTickCount();
Sleep(1);
}
closesocket(sockClient);
WSACleanup();
}