1.首先标志位设Non-blocking模式准备非阻塞模式调用connect函数
2.调用connect情况TCP三握手需要些间;非阻塞调用要能立即完返错误所返EINPROGRESS表示建立连接没完
3.读套接口描述符集(fd_set rset)写套接口描述符集(fd_set
wset)前套接口置位(用FD_ZERO()、FD_SET()宏)并设置超间(struct
timeval *timeout)
4.调用select( socket, &rset, &wset, NULL, timeout )
返0表示connect超
设置超间于75秒没必要做内核connect超限制75秒
网络编程socket量我想家都清楚socket套接口套接口编程提超概念我能想3:发送超接收超及select超(注:
select函数并用于套接口套接口编程用比较)connect目标主机候超由我设置情况超都并且connect阻塞主机能连接等着connect返能忍受程序要要试图连接主机恐怕遇能连接主机候塞受我废少说先说说我觉已掌握种用再看解我愿意与享本文已Linux程序例拿Windows非换几函数名字罢
Linux要给connect设置超应该两种种该系统些参数我讲我讲清楚:P编程实现另外种变相实现connect超我要讲原理:
1.建立socket
2.该socket设置非阻塞模式
3.调用connect()
4.使用select()检查该socket描述符否写(注意写)
5.根据select()返结判断connect()结
6.socket设置阻塞模式(程序需要用阻塞模式步省般情况都用阻塞模式容易管理)
网络编程熟悉其实我说程知道写程序面给我写段程序仅供参考
/******************************
* Time out for connect()
* Write by Kerl W
******************************/
#include
#include
#define TIME_OUT_TIME 20 //connect超间20秒
int main(int argc , char **argv)
{
………………
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0) exit(1);
struct sockaddr_in serv_addr;
………//服务器址填充结构serv_addr
int error=-1, len;
len = sizeof(int);
timeval tm;
fd_set set;
unsigned long ul = 1;
ioctl(sockfd, FIONBIO, &ul); //设置非阻塞模式
bool ret = false;
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) ==
-1)
{
tm.tv_set = TIME_OUT_TIME;
tm.tv_uset = 0;
FD_ZERO(&set);
FD_SET(sockfd, &set);
if( select(sockfd+1, NULL, &set, NULL, &tm) > 0)
{
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
if(error == 0) ret = true;
else ret = false;
} else ret = false;
}
else ret = true;
ul = 0;
ioctl(sockfd, FIONBIO, &ul); //设置阻塞模式
if(!ret)
{
close( sockfd );
fprintf(stderr , "Cannot Connect the server!n");
return;
}
fprintf( stderr , "Connected!n");
//面进行发包收包操作
……………
}
代码片段仅供参考初者提供些提示主要用几函数select,
ioctl,
getsockopt都找相关资料具体用我赘述需要linux轻轻敲man
<函数名>能够看用
外我需要说明几点虽我用ioctl套接口设置非阻塞模式select本身阻塞阻塞间其超间由调用select
候参数timeval类型变量指针指向timeval结构变量决定timeval结构由表示秒数表示微秒数(long类型)员组般我设置秒数行微妙数设0(注:1秒等于100万微秒)select函数另值提参数面我用fd_set类型变量指针调用前变量面存要用select检查描述符调用针面程序面写描述符我用宏FD_ISSET检查某描述符否其由于我套接口描述符我没使用FD_ISSET宏检查调用selectsockfd否set面其实需要加判断我用getsockopt检查才判断套接口否真连接我变相用select检查否连接实际select检查否写于写针三种条件任条件满足都表示写:
1)套接口发送缓冲区用控件字节数于等于套接口发送缓冲区低潮限度前值且或者i)套接口已连接或者ii)套接口要求连接(UDP式)
2)连接写半关闭
3)套接口错误待处理
我需要用getsockopt函数获取套接口目前些信息判断否真连接没连接候能给发错误我程序并没标状态简单表示连接/连接
面我谈谈程序测试结我针3种情形做测试:
1. 目标机器网络情况
连接目标主机并能功阻塞式进行发包收包作业
2. 目标机器网络断情况
等待设置超间(面程序20秒)显示目标主机能连接
3. 程序运行前断目标机器网络超间内恢复目标机器网络
恢复目标主机网络连接前程序等待恢复目标主机程序显示连接目标主机功并能功阻塞式进行发包收包作业
各种情况测试结表明种设置connect超完全行我自种设置超connect封装自类库用套监控系统目前止运行算种编程实现connect超比起修改系统参数种点于用于程序影响系统