connect非阻塞,send和recv是阻塞的,会影响发送和接收吗?

轻箬笠 轻箬笠 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
SOCKET/*int*/ sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sockfd < 0)
{
return;
}
struct sockaddr_in serv_addr;

//以服务器地址填充结构serv_addr
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(strIP);
serv_addr.sin_port = htons(nPort);
int iTimeOut = 3000;
setsockopt(hSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&iTimeOut,sizeof(iTimeOut));
setsockopt(hSocket,SOL_SOCKET,SO_SNDTIMEO,(char*)&iTimeOut,sizeof(iTimeOut));

int error = -1;
int len = sizeof(int);
timeval tm;
fd_set set;
unsigned long ul = 1;
ioctlsocket(sockfd, FIONBIO, &ul); //设置为非阻塞模式
bool ret = false;
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
{
tm.tv_sec = 3;
tm.tv_usec = 0;
FD_ZERO(&set);
FD_SET(sockfd, &set);
if( select(sockfd+1, NULL, &set, NULL, &tm) > 0)
{
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char *)&error, /*(socklen_t *)*/&len);
if(error == 0)
ret = true;
else
ret = false;
}
else
ret = false;
}
else
ret = true;
ul = 0;
ioctlsocket(sockfd, FIONBIO, &ul); //设置为阻塞模式
if(!ret)
{
closesocket( sockfd );
fprintf(stderr , "Cannot Connect the server!/n");
return;
}

fprintf( stderr , "Connected!/n");

char buff[] = "hello";
int sl=::send(sockfd,(char*)buff, sizeof(buff), 0);
char buffer[512] = {0};
int ret = recv(sockfd, buffer, sizeof(buffer), 0);
closesocket( sockfd );


我的逻辑是这样的,设置接收和发送超时。考虑到connect在阻塞模式下,超时时间很长,设置为非阻塞模式,connect成功后,设回阻塞模式。但是测试情况来看,有大概20%的概率recv失败,有一部分错误码是10060(WSAETIMEDOUT 连接超时)。
这究竟是为什么?
...全文

相关推荐

评论 6
收藏 已收藏
分享
返回顶部
轻箬笠
C++ 语言 65,214 成员 250,514 内容