当前位置:  技术问答>linux和unix

tcp connect 连接非阻塞超时连接?

    来源: 互联网  发布时间:2017-01-09

    本文导语:  linux  3.0 内核。。。  我试了下。2.6好像也是吧。。。 首先设置SOCKET为非阻塞。 然后select  来判断超时。。 但是毫无作用,如果连接一个没有的地址会出现 操作中的提示。一直是这个返回。。。怎么回事 查...

linux  3.0 内核。。。
 我试了下。2.6好像也是吧。。。


首先设置SOCKET为非阻塞。 然后select  来判断超时。。

但是毫无作用,如果连接一个没有的地址会出现 操作中的提示。一直是这个返回。。。怎么回事

查了下资料说 unix 才这样 linux 没法。。。

你们谁实验成功了?

|


我想让它失败后多尝试几次重连,发现没效果,你就判断一趟就行了.

connect,返回0直接成功,返回-1且错误是EINPROGRESS则调用select等待,select返回判断如果是正常返回且getsockopt SO_ERROR如果没有出错的话可以认为连接成功,select超时范围则认为连接失败.

其实红色那句话经过测试无论是否连接成功都不会返回错误.
只要连接成功,或者连接失败,select都会几乎立即返回,根本不会停留,所以楼主必须在select里调用点其他的东西,比如getpeername看看是否出错,getsockopt那句是废话,APUE书上写的是错的。

|
非阻塞connect的问题,贴一下你写的代码围观一下.

|
我拿以前些代码改了改,测试了一下,非阻塞connect的代码和测试server我是这么写的,一切正常:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main()
{
int clifd=socket(AF_INET,SOCK_STREAM,0);

if(clifd==-1)
{
return 1;
}

int flag;

if(fcntl(clifd,F_GETFL,&flag)==-1)
{
perror("fcntl:GETFL");
return 2;
}

flag|=O_NONBLOCK;

if(fcntl(clifd,F_SETFL,&flag)==-1)
{
perror("fcntl:SETFL");
return 3;
}

fd_set rSet,wSet;
fd_set rrSet,wrSet;

bzero(&rSet,sizeof(fd_set));
bzero(&wSet,sizeof(fd_set));

FD_SET(clifd,&rSet);
FD_SET(clifd,&wSet);

sockaddr_in srvAddr;

srvAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
srvAddr.sin_port=htons(12000);
srvAddr.sin_family=AF_INET;

int times=0;
int sus=0;

while(times++0 )
{
if(FD_ISSET(clifd,&rrSet)||FD_ISSET(clifd,&wrSet))
{
int err=0;

socklen_t len=sizeof(err);

if(getsockopt(clifd,SOL_SOCKET,SO_ERROR,&err,&len)==-1)
{
continue;
}

if(err!=0)
{
continue;
}

sus=1;
break;
}
}
else if(nRet==0)
{
printf("out of timen");
}
else
{
printf("select error");
}
}

if(sus==1)
{
printf("connect after it n");
close(clifd);
}

return 0;
}


#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc,char *argv[])
{
int s;
int status=1;

struct sockaddr_in server;
struct sockaddr_in client;

if( (s=socket(AF_INET,SOCK_STREAM,0))==-1 )
{
perror("socket:");
return 1;
}

setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&status,sizeof(status));

bzero(&server,sizeof(server));
server.sin_port=htons(12000);
server.sin_addr.s_addr=inet_addr("127.0.0.1");
server.sin_family=AF_INET;

if( (status=bind(s,(struct sockaddr*)&server,sizeof(struct sockaddr_in)))==-1 )
{
perror("bind");
return 2;
}

if(listen(s,5)==-1)
{
perror("listen");
return 10;
}

char buffer[1024];
socklen_t len=sizeof(struct sockaddr);
size_t n;

int clifd;

while(true)
{
clifd=accept(s,(struct sockaddr*)&client,&len);

printf("accept donen");

if(clifd==-1)
{
perror("accept");
return 12;
}

while(true)
{
n=recv(clifd,buffer,1024,0);

if(n==-1)
{
if(errno!=EINTR)
{
perror("recv:");
return 1;
}

continue;
}
else if(n==0)
{
close(clifd);
break;
}
else
{
buffer[n]=0;
printf("%sn",buffer);
}
}
}

close(s);

return 0;
}

|
       struct timeval tv;
        tv.tv_sec=5000;
        tv.tv_usec=0;    

改成:

       struct timeval tv;
        tv.tv_sec=2;
        tv.tv_usec=0;    

    
 
 

您可能感兴趣的文章:

  • 请问怎么知道每个TCP连接所属哪个进程??还有怎么样断开系统中任意一个TCP连接?
  • 转发 TCP/IP 连接 prtunnel
  • tcp连接数的限制
  • 请问在linux上tcp能够接收的最大连接数是多少?
  • 跟相同IP,端口不同的TCP服务端连接问题
  • tcp连接未断开,发送失败?
  • linux下TCP连接进行容错怎么实现的
  • TCP/IP 连接诊断工具 Why Can't I Connect?
  • 载断TCP UDP连接
  • 高可用集群系统中tcp连接容错
  • Linux如何关闭一个TCP连接
  • 如何在redhat系统中手动断开一个TCP连接
  • tcp连接的问题,达人请进
  • 在Linux下同时使用5000个TCP连接的问题
  • linux下如何操作已经存在的TCP连接
  • tcp的最大连接数?
  • 问一个TCP连接终接的问题
  • red hat 怎么修改tcp连接数
  • LINUX C 进行TCP网络连接,怎样设置连接超时时间?
  • TCP连接中创建的监听描述字和已连接描述字(套接字)对应的是同一个套接口么,如果是的话,读写数据时系统怎么区分是哪个套接字的?
  • 请问使用TCP/IP时,服务器阻塞的问题。(在线讨论)!!
  • TCP发送数据,假如发送套接口是非阻塞的,而要发送的数据大于缓冲区尺寸
  • 关于TCP阻塞问题请教
  • 使用TCP,在客户端怎么知道建立好的连接已经断开?怎么用非阻塞模式,以及怎么知道socket已经收到数据并立即将数据读出?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • win2003应用程序日志-状态服务器已关闭超时的 TCP/IP 连接的解决方法
  • java命名空间java.net接口socketoptions的类成员方法: tcp_nodelay定义及介绍
  • http走的是tcp还是udp?ssh是tcp还是udp?
  • Linux内核中影响tcp三次握手的一些协议配置
  • 100分求《嵌入式系统Web服务器—TCP/IP Lean》或《TCP/IP Lean Web Servers for Embedded Systems 》
  • TCP协议报头字段详解及报头图
  • tcp和udp套接字有何不同?在什么情况下用tcp什么情况下用udp????
  • 对TCP协议状态及状态转换理解
  • tcp_prequeue_process怎么调用了tcp_v4_do_rcv的??求解??在tcp_recvmsg调用的
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 求助!!!linux tcp发送 xp tcp接收 出现的问题
  • TCP协议三次握手过程详解
  • 高分求救:SOL_SOCKET,SO_RCVTIMO,SO_SNDTIMEO,IPPOTO_TCP,TCP_NODELAY这些是在哪个头文件定义的呢?
  • TCP/IP协议族介绍及TCP/IP协议族中各协议对应的RFC编号
  • 请问RST在什么情况下发送?? 使用TCP socket编程的话是否会引起这种TCP包的发送?
  • HTML教程 iis7站长之家
  • TCP_NODDELAY的问题
  • linux内核tcp重组的函数?
  • tcp的分节表示什么?
  • 如何在Linux系统上运行T/TCP程序
  • 控制在网络上传输TCP数据包的大小的问题
  • SCO Openserver 5 TCP/IP


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3