timer的sigaction对TCP连接有影响吗?

[复制链接]
2170|1
 楼主| ckz100 发表于 2008-3-24 16:17 | 显示全部楼层 |阅读模式
有一个tcp&nbsp;client程序,原来可以用的,为什么加上一个timer的sigaction就不能用了?感觉是由于timer的sigaction,导致了TCP连接断线了<br /><br />可以用的程序:<br />int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;sockaddr_in&nbsp;client_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;客户端(本地)的socket地址结构<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;sockaddr_in&nbsp;server_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;服务器端(远程)的socket地址结构<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;client_socket;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;客户端socket&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;socklen_t&nbsp;server_addr_length;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;buffer[BUFFER_SIZE];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;缓冲区大小<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;length&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(&client_addr,&nbsp;sizeof(client_addr));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置一个SOCKET地址结构client_addr,代表客户机INTERNET地址,端口<br />&nbsp;&nbsp;&nbsp;&nbsp;client_addr.sin_family&nbsp;=&nbsp;AF_INET;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;internet协议族<br />&nbsp;&nbsp;&nbsp;&nbsp;client_addr.sin_addr.s_addr&nbsp;=&nbsp;htons(INADDR_ANY);&nbsp;&nbsp;//&nbsp;INADDR_ANY表示获取本机地址<br />&nbsp;&nbsp;&nbsp;&nbsp;client_addr.sin_port&nbsp;=&nbsp;htons(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;0表示让系统自动分配一个空闲端口<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;client_socket&nbsp;=&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;0);&nbsp;&nbsp;//&nbsp;创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket<br />&nbsp;&nbsp;&nbsp;&nbsp;if(client_socket&nbsp;&lt&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Create&nbsp;Socket&nbsp;Failed!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bind(client_socket,&nbsp;(struct&nbsp;sockaddr&nbsp;*)&client_addr,&nbsp;sizeof(client_addr)))&nbsp;{&nbsp;&nbsp;&nbsp;//&nbsp;把客户机的socket和客户机的socket地址结构联系起来<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Client&nbsp;Bind&nbsp;Port&nbsp;Failed!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(&server_addr,&nbsp;sizeof(server_addr));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置一个socket地址结构server_addr,代表服务器的internet地址,端口<br />&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_family&nbsp;=&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_addr.s_addr&nbsp;=&nbsp;inet_addr(SERVER_IP);<br />&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_port&nbsp;=&nbsp;htons(SERVER_PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;server_addr_length&nbsp;=&nbsp;sizeof(server_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(connect(client_socket,&nbsp;(struct&nbsp;sockaddr&nbsp;*)&server_addr,&nbsp;server_addr_length)&nbsp;&lt&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Can&nbsp;Not&nbsp;Connect&nbsp;To&nbsp;%s!
&quot;,&nbsp;SERVER_IP);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(length=recv(client_socket,&nbsp;buffer,&nbsp;BUFFER_SIZE,&nbsp;0))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(length&nbsp;&lt&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Recieve&nbsp;Data&nbsp;From&nbsp;Server&nbsp;Failed!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Recieve&nbsp;Data
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(client_socket);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />/**************************************************************************************/<br />加了timer&nbsp;sigaction后的程序:<br /><br />struct&nbsp;timeval&nbsp;tpstart,tpend;<br />float&nbsp;timeuse;<br /><br />static&nbsp;long&nbsp;int&nbsp;timer_count&nbsp;=&nbsp;0;<br />void&nbsp;prompt_info(int&nbsp;signo)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;t;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((++timer_count)%100==0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;=&nbsp;time(NULL);&nbsp;&nbsp;//获取秒数表示的当时系统时间,time返回从格林尼治时间1970年1月1日0:00开始到现在的秒数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;[%d]prompt_info&nbsp;called&quot;,&nbsp;timer_count);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;time&nbsp;%s&quot;,&nbsp;ctime(&t));&nbsp;&nbsp;//将秒数转换成字符串输出<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gettimeofday(&tpend,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeuse&nbsp;=&nbsp;1000000&nbsp;*&nbsp;(tpend.tv_sec&nbsp;-&nbsp;tpstart.tv_sec)&nbsp;+&nbsp;tpend.tv_usec&nbsp;-&nbsp;tpstart.tv_usec;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&nbsp;&nbsp;&nbsp;&nbsp;Used&nbsp;Time:%f
&quot;,&nbsp;timeuse);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;init_sigaction(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;sigaction&nbsp;act;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;clock&nbsp;tick&nbsp;frequency&nbsp;is&nbsp;%d
&quot;,HZ);&nbsp;&nbsp;//输出时钟滴答的频率<br />&nbsp;&nbsp;&nbsp;&nbsp;act.sa_handler&nbsp;=&nbsp;prompt_info;<br />&nbsp;&nbsp;&nbsp;&nbsp;act.sa_flags&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;sigemptyset(&act.sa_mask);<br />&nbsp;&nbsp;&nbsp;&nbsp;sigaction(SIGALRM,&nbsp;&act,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;gettimeofday(&tpstart,&nbsp;NULL);<br />}<br /><br />void&nbsp;init_time(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;itimerval&nbsp;val;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;val.it_value.tv_sec&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置间隔定时器的当前值<br />&nbsp;&nbsp;&nbsp;&nbsp;val.it_value.tv_usec&nbsp;=&nbsp;10000;&nbsp;&nbsp;&nbsp;&nbsp;//取值要大等于时钟滴答的周期,否则仍为时钟滴答的时间<br />&nbsp;&nbsp;&nbsp;&nbsp;val.it_interval&nbsp;=&nbsp;val.it_value;&nbsp;&nbsp;//间隔计数器的初始值<br />&nbsp;&nbsp;&nbsp;&nbsp;setitimer(ITIMER_REAL,&nbsp;&val,&nbsp;NULL);&nbsp;&nbsp;&nbsp;//设置真实间隔定时器,定时结束后将发出SIGALRM信号<br />}<br /><br />int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;sockaddr_in&nbsp;client_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;客户端(本地)的socket地址结构<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;sockaddr_in&nbsp;server_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;服务器端(远程)的socket地址结构<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;client_socket;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;客户端socket&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;socklen_t&nbsp;server_addr_length;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;buffer[BUFFER_SIZE];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;缓冲区大小<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;length&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;init_sigaction();<br />&nbsp;&nbsp;&nbsp;&nbsp;init_time();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(&client_addr,&nbsp;sizeof(client_addr));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置一个SOCKET地址结构client_addr,代表客户机INTERNET地址,端口<br />&nbsp;&nbsp;&nbsp;&nbsp;client_addr.sin_family&nbsp;=&nbsp;AF_INET;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;internet协议族<br />&nbsp;&nbsp;&nbsp;&nbsp;client_addr.sin_addr.s_addr&nbsp;=&nbsp;htons(INADDR_ANY);&nbsp;&nbsp;//&nbsp;INADDR_ANY表示获取本机地址<br />&nbsp;&nbsp;&nbsp;&nbsp;client_addr.sin_port&nbsp;=&nbsp;htons(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;0表示让系统自动分配一个空闲端口<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;client_socket&nbsp;=&nbsp;socket(AF_INET,&nbsp;SOCK_STREAM,&nbsp;0);&nbsp;&nbsp;//&nbsp;创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket<br />&nbsp;&nbsp;&nbsp;&nbsp;if(client_socket&nbsp;&lt&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Create&nbsp;Socket&nbsp;Failed!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bind(client_socket,&nbsp;(struct&nbsp;sockaddr&nbsp;*)&client_addr,&nbsp;sizeof(client_addr)))&nbsp;{&nbsp;&nbsp;&nbsp;//&nbsp;把客户机的socket和客户机的socket地址结构联系起来<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Client&nbsp;Bind&nbsp;Port&nbsp;Failed!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;bzero(&server_addr,&nbsp;sizeof(server_addr));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置一个socket地址结构server_addr,代表服务器的internet地址,端口<br />&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_family&nbsp;=&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_addr.s_addr&nbsp;=&nbsp;inet_addr(SERVER_IP);<br />&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_port&nbsp;=&nbsp;htons(SERVER_PORT);<br />&nbsp;&nbsp;&nbsp;&nbsp;server_addr_length&nbsp;=&nbsp;sizeof(server_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(connect(client_socket,&nbsp;(struct&nbsp;sockaddr&nbsp;*)&server_addr,&nbsp;server_addr_length)&nbsp;&lt&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Can&nbsp;Not&nbsp;Connect&nbsp;To&nbsp;%s!
&quot;,&nbsp;SERVER_IP);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(length=recv(client_socket,&nbsp;buffer,&nbsp;BUFFER_SIZE,&nbsp;0))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(length&nbsp;&lt&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Recieve&nbsp;Data&nbsp;From&nbsp;Server&nbsp;Failed!
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Recieve&nbsp;Data
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(client_socket);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
 楼主| ckz100 发表于 2008-3-24 17:54 | 显示全部楼层

刚测试,用alarm调用就不会导到TCP断开连接

刚测试,用alarm调用就不会导到TCP断开连接<br />用setitimer函数就会,这是为什么呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

82

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部