socket error 10057问题 _错误记录

10057 是socket is not connected,后来发现之前套接字设置成非阻塞,connect 尝试连接时连接不通立即返回,此时TCP还在三次握手,所以要写成非阻塞connect限时模式,让select函数检查是否成功连接,并设置超时检测功能。

另外注意两点移植

 

问题: 1.getsockopt源自Berkeley的实现是返回0,等待处理的错误在变量errno中返回;但是Solaris会让getsockopt返回-1,errno置为待处理的错误;我们对这两种情况都要处理;

2.在处理非阻塞connect时,在不同的套接口实现的平台中存在的移植性问题,首先,有可能在调用select之前,连接就已经建立成功,而且对方的数据已经到来.在这种情况下,连接成功时套接口将既可读又可写.这和连接失败时是一样的.这个时候我们还得通过getsockopt来读取错误值


简单代码如下,仅供参考:

BOOL  ConnectServer(int robot_num)
{
char errnum[10] = {0};
int err = -1;
int error = -1;
int errlen = sizeof(error);
int no1 = robot_num;
fd_set wset;
struct timeval tm;
tm.tv_sec = 5;
tm.tv_usec = 0;
FD_ZERO(&wset);
FD_SET(sHost[no1],&wset);


//设置服务器地址
servAddr.sin_family =AF_INET;
servAddr.sin_addr.s_addr = inet_addr("192.168.1.104");//&ip[no1-1][0]    
servAddr.sin_port = htons(6665); //atoi(&port[no1-1][0])    

//连接服务器

retVal=connect(sHost[no1],(LPSOCKADDR)&servAddr, sizeof(servAddr));
err = WSAGetLastError();

if(SOCKET_ERROR == retVal)
{
if( WSAEWOULDBLOCK == err || WSAEINVAL == err) //无法立即完成非阻塞的操作
{
if(select(0,NULL,&wset,NULL,&tm) <= 0){    //此处错误超时 或者 连接不上 ;返回0,代表超时
printf("error code is %s\n",strerror(errno));
closesocket(sHost[no1]);
}
if( !FD_ISSET(sHost[no1],&wset)){   //若是集合里的值,非零;
printf("error code is %s\n",strerror(errno));
closesocket(sHost[no1]);
}
getsockopt(sHost[no1],SOL_SOCKET,SO_ERROR,(char*)&error,&errlen);
if (error != 0)
{
printf("Connect failed!\n");
bConnecting = FALSE;
}else{
printf("Connect successfully!\n");
bConnecting = TRUE;
}
}else if (WSAEISCONN == err)//连接已经完成
{
printf("连接已经完成 \n");

}else if (WSAENOTCONN == err)//连接没有完成
{
printf("socket is not connected \n");

}else//其它原因,连接失败
{
printf("connect err =%d\n",err);  //在非阻塞套接字上尝试一个已经正在进行的操作
printf("其它原因,连接失败\n");
}
}


if ( retVal == 0 )//连接成功
{
printf("Connect successfully!\n");
bConnecting = TRUE;
}
return bConnecting;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值