请教在linux平台下非阻塞socket connect之后判断是否连接成功???

shizhongqi 2013-11-14 11:05:25
int successConnect(int sockid)
{
int i, Num, ret;
UBYTE temp[256];
struct timeval wt;
struct sockaddr_in peeraddr;
socklen_t len;
Sock = sockid;
FD_SET(Sock, &orig_fdset);

wt.tv_sec = 0;
wt.tv_usec = 100000;//这是我定义等待多长时间都不管用
memcpy(&fdset, &orig_fdset,sizeof(orig_fdset));
if(select(sockid+1, (fd_set *)0, &fdset, (fd_set *)0, (struct timeval *)&wt)<=0)
{
ClosePort(sockid);
FD_CLR(sockid, &orig_fdset);
return -1;
}
else
{
Num = ReadPort(sockid, temp, 0);
if(Num < 0)
{
ClosePort(sockid);
FD_CLR(sockid, &orig_fdset);
return -1;
}
else if(Num == 0)
{
int ret = getpeername(sockid, (struct sockaddr *)&peeraddr, &len);
if (ret == 0)
{
return 0;//这里表示连接正确
}
else
{
ClosePort(sockid);
FD_CLR(sockid, &orig_fdset);
return -1;//所有返回-1为连接错误
}
}
}
}

这是一个非阻塞socket, connect已经完成上面这个successConnect函数是为了查看有没有连接成功。
请问这段判断连接是否成功的函数有什么问题么,为什么我连接好几次才能连上呢?
是不是我connect之后直接用这个函数判断太快了。。。
...全文
400 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shizhongqi 2013-11-30
  • 打赏
  • 举报
回复
还有我说一下 我把两台机器都放在我们公司的公共网络上连接出现的连接几次才能连接上的情况。 如果我用网线直接连就不会出现。
shizhongqi 2013-11-30
  • 打赏
  • 举报
回复
int ret = getpeername(sockid, (struct sockaddr *)&peeraddr, &len); 上面你们说的方法可能不适用我现在的系统,我用getsockopt判断 返回连接成功但是实际上是没成功的消息发不出。用我的方法能连接几次才能成功每次连接不成功都是到我上面这个语句返回的失败。。。
shizhongqi 2013-11-30
  • 打赏
  • 举报
回复
Arnold9009 2013-11-19
  • 打赏
  • 举报
回复
select检查可写之后(select返回值大于0),然后在用getsockopt获取SO_ERROR的值,如果getsockopt返回0并且获取到的值等于0,则可以发送数据了。。。
linqweasd 2013-11-18
  • 打赏
  • 举报
回复
了解我的网络框架里怎么做的:https://code.csdn.net/qq120848369/ez_poll
lalune 2013-11-14
  • 打赏
  • 举报
回复
检查一下select的返回值定义 返回-1是出错 返回0是无连接应该正常返回 ret = select(sockid+1, (fd_set *)0, &fdset, (fd_set *)0, (struct timeval *)&wt); if(ret == 0) return 0; else if(ret < 0) { ClosePort(sockid); FD_CLR(sockid, &orig_fdset); return -1; } .......
lishangxi1 2013-11-14
  • 打赏
  • 举报
回复
试试用FD_ISSET检查可读与可写。。。linux connect返回0即连接成功
qq120848369 2013-11-14
  • 打赏
  • 举报
回复
了解我的网络框架里怎么做的:https://code.csdn.net/qq120848369/ez_poll
lishangxi1 2013-11-14
  • 打赏
  • 举报
回复
http://blog.csdn.net/shellching/article/details/7663086 可以看看这篇文章,看看能对你有帮助不
shizhongqi 2013-11-14
  • 打赏
  • 举报
回复
引用 1 楼 lishangxi1 的回复:
试试用FD_ISSET检查可读与可写。。。linux connect返回0即连接成功
我是非阻塞模式的这样不行。
shizhongqi 2013-11-14
  • 打赏
  • 举报
回复
引用 2 楼 lalune 的回复:
检查一下select的返回值定义 返回-1是出错 返回0是无连接应该正常返回 ret = select(sockid+1, (fd_set *)0, &fdset, (fd_set *)0, (struct timeval *)&wt); if(ret == 0) return 0; else if(ret < 0) { ClosePort(sockid); FD_CLR(sockid, &orig_fdset); return -1; } .......
不行啊 这样返回0还是没有连接成功 发送数据失败

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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