关于 socket阻塞的问题,大哥们啊,求求你们了啊

cjjyyf 2006-07-31 12:40:20
我建的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();

}
...全文
142 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧