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

时间:2022-09-09 08:41:19
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之后直接用这个函数判断太快了。。。

11 个解决方案

#1


试试用FD_ISSET检查可读与可写。。。linux connect返回0即连接成功

#2


检查一下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;
}
.......

#3


引用 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还是没有连接成功 发送数据失败

#4


引用 1 楼 lishangxi1 的回复:
试试用FD_ISSET检查可读与可写。。。linux connect返回0即连接成功

我是非阻塞模式的这样不行。

#5


http://blog.csdn.net/shellching/article/details/7663086
可以看看这篇文章,看看能对你有帮助不

#6


了解我的网络框架里怎么做的:https://code.csdn.net/qq120848369/ez_poll

#7


了解我的网络框架里怎么做的:https://code.csdn.net/qq120848369/ez_poll

#8


select检查可写之后(select返回值大于0),然后在用getsockopt获取SO_ERROR的值,如果getsockopt返回0并且获取到的值等于0,则可以发送数据了。。。

#9


int ret = getpeername(sockid, (struct sockaddr *)&peeraddr, &len);
上面你们说的方法可能不适用我现在的系统,我用getsockopt判断 返回连接成功但是实际上是没成功的消息发不出。用我的方法能连接几次才能成功每次连接不成功都是到我上面这个语句返回的失败。。。

#10


还有我说一下 我把两台机器都放在我们公司的公共网络上连接出现的连接几次才能连接上的情况。
如果我用网线直接连就不会出现。

#11


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

#1


试试用FD_ISSET检查可读与可写。。。linux connect返回0即连接成功

#2


检查一下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;
}
.......

#3


引用 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还是没有连接成功 发送数据失败

#4


引用 1 楼 lishangxi1 的回复:
试试用FD_ISSET检查可读与可写。。。linux connect返回0即连接成功

我是非阻塞模式的这样不行。

#5


http://blog.csdn.net/shellching/article/details/7663086
可以看看这篇文章,看看能对你有帮助不

#6


了解我的网络框架里怎么做的:https://code.csdn.net/qq120848369/ez_poll

#7


了解我的网络框架里怎么做的:https://code.csdn.net/qq120848369/ez_poll

#8


select检查可写之后(select返回值大于0),然后在用getsockopt获取SO_ERROR的值,如果getsockopt返回0并且获取到的值等于0,则可以发送数据了。。。

#9


int ret = getpeername(sockid, (struct sockaddr *)&peeraddr, &len);
上面你们说的方法可能不适用我现在的系统,我用getsockopt判断 返回连接成功但是实际上是没成功的消息发不出。用我的方法能连接几次才能成功每次连接不成功都是到我上面这个语句返回的失败。。。

#10


还有我说一下 我把两台机器都放在我们公司的公共网络上连接出现的连接几次才能连接上的情况。
如果我用网线直接连就不会出现。

#11


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