当前位置: 技术问答>linux和unix
socket编程:如何设置connect返回时间?
来源: 互联网 发布时间:2016-03-21
本文导语: socket编程:如何设置connect返回时间? tcp,客户端调用connect连接服务器端,往往会连接失败,有如下两个问题请教: 1,在linux中,从调用connect开始到失败返回是多少时间?据我所知,connect的实现中在连接失败后是...
socket编程:如何设置connect返回时间?
tcp,客户端调用connect连接服务器端,往往会连接失败,有如下两个问题请教:
1,在linux中,从调用connect开始到失败返回是多少时间?据我所知,connect的实现中在连接失败后是不是要自动重新连接若干次,采用什么指数回退算法等到很长时间后才返回?
2,如果connect失败返回需要较长时间,能不能通过什么函数或者参数修改connect的返回时间?因为我需要它尽快返回。
tcp,客户端调用connect连接服务器端,往往会连接失败,有如下两个问题请教:
1,在linux中,从调用connect开始到失败返回是多少时间?据我所知,connect的实现中在连接失败后是不是要自动重新连接若干次,采用什么指数回退算法等到很长时间后才返回?
2,如果connect失败返回需要较长时间,能不能通过什么函数或者参数修改connect的返回时间?因为我需要它尽快返回。
|
设置成非阻塞方式,用select来控制超时
|
这个总是的解决方法有好几种:
select 方法,pselect 方法,poll方法,后两种方法并不能所有的系统都能适合
下面是"网络编程"中的code:
select 方法,pselect 方法,poll方法,后两种方法并不能所有的系统都能适合
下面是"网络编程"中的code:
1 #include "unp.h"
2 void
3 str_cli(FILE *fp, int sockfd)
4 {
5 int maxfdp1, stdineof;
6 fd_set rset;
7 char buf[MAXLINE];
8 int n;
9 stdineof = 0;
10 FD_ZERO(&rset);
11 for ( ; ; ) {
12 if (stdineof == 0)
13 FD_SET(fileno(fp), &rset);
14 FD_SET(sockfd, &rset);
15 maxfdp1 = max(fileno(fp), sockfd) + 1;
16 Select(maxfdp1, &rset, NULL, NULL, NULL);
17 if (FD_ISSET(sockfd, &rset)) { /* socket is readable */
18 if ( (n = Read(sockfd, buf, MAXLINE)) == 0) {
19 if (stdineof == 1)
20 return; /* normal termination */
21 else
22 err_quit("str_cli: server terminated prematurely");
23 }
24 Write(fileno(stdout), buf, n);
25 }
26 if (FD_ISSET(fileno(fp), &rset)) { /* input is readable */
27 if ( (n = Read(fileno(fp), buf, MAXLINE)) == 0) {
28 stdineof = 1;
29 Shutdown(sockfd, SHUT_WR); /* send FIN */
30 FD_CLR(fileno(fp), &rset);
31 continue;
32 }
33 Writen(sockfd, buf, n);
34 }
35 }
36 }
|
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define TIME_OUT_TIME 1 //connect超时时间20秒
int main(int argc , char **argv)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd 0)
{
printf("%s:%dn",__FILE__,__LINE__);
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (int*)&len);
if(error == 0) ret = true;
else ret = false;
}
else ret = false;
}
else ret = true;
ul = 0;
printf("%s:%dn",__FILE__,__LINE__);
//ioctl(sockfd, FIONBIO, &ul); //设置为阻塞模式
fcntl(sockfd, F_SETFL, flags);
if(!ret)
{
close( sockfd );
fprintf(stderr , "Cannot Connect the server!n");
return 0;
}
fprintf( stderr , "Connected!n");
//下面还可以进行发包收包操作
while(1)
{
char buf[1024]; memset(buf,0,sizeof(buf));
read(sockfd,buf,sizeof(buf));
printf("%sn",buf);
}
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define TIME_OUT_TIME 1 //connect超时时间20秒
int main(int argc , char **argv)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd 0)
{
printf("%s:%dn",__FILE__,__LINE__);
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (int*)&len);
if(error == 0) ret = true;
else ret = false;
}
else ret = false;
}
else ret = true;
ul = 0;
printf("%s:%dn",__FILE__,__LINE__);
//ioctl(sockfd, FIONBIO, &ul); //设置为阻塞模式
fcntl(sockfd, F_SETFL, flags);
if(!ret)
{
close( sockfd );
fprintf(stderr , "Cannot Connect the server!n");
return 0;
}
fprintf( stderr , "Connected!n");
//下面还可以进行发包收包操作
while(1)
{
char buf[1024]; memset(buf,0,sizeof(buf));
read(sockfd,buf,sizeof(buf));
printf("%sn",buf);
}
}