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