首页 > 其他 > 详细

SOCKET编程:为什么recv不阻塞

时间:2014-03-24 12:53:58      阅读:641      评论:0      收藏:0      [点我收藏+]

服务器端:

bubuko.com,布布扣
  1 #include <sys/types.h>
  2 #include <sys/socket.h>
  3 #include <netinet/in.h>
  4 #include <arpa/inet.h>
  5 #include <unistd.h>
  6 #include <stdio.h>
  7 #include <stdlib.h>
  8 #include <string.h>
  9 #include <fstream>
 10 #include <sstream>
 11 #include <iostream>
 12 #include <vector>
 13 #include <error.h>
 14 using namespace std;
 15 
 16 int main()
 17 {
 18     double bs_x[] = {35,-3,76,76,-3};
 19     double bs_y[] = {35,77,77,-3,-3};
 20     //vector<vector<double> > tdoa;
 21     double tdoa[384][4];
 22     
 23     ifstream infile("otdoa.txt");
 24     if( !infile)
 25     {
 26         cout << "can‘t open otdoa.txt" << endl;
 27         return -1;
 28     }
 29     int i = 0;
 30     int j = 0;
 31     while(infile)
 32     {
 33         string line;
 34         double a;
 35         //vector<double> ta;
 36         /*infile >> line;
 37         istringstream stream(line);
 38         int j = 0;
 39         while(stream >> a)
 40         {
 41             tdoa[i][j] = a;
 42             j++;
 43         }*/
 44         if( j == 4)
 45         {
 46             i++;
 47             j = 0;
 48         }
 49         infile >> tdoa[i][j];
 50         j++;
 51         if(infile.peek() == \n)
 52             break;
 53     }
 54     infile.close();
 55     
 56     int listenfd,confd;
 57     struct sockaddr_in servaddr;
 58     
 59     listenfd = socket(AF_INET,SOCK_STREAM,0);
 60     if(listenfd < 0)
 61     {
 62         cout << "can‘t open socket" << endl;
 63         return -1;
 64     }
 65     
 66     bzero(&servaddr,sizeof(servaddr));
 67     servaddr.sin_family = AF_INET;
 68     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
 69     servaddr.sin_port = htons(9999);
 70     
 71     if( bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0)
 72     {
 73         //cout << "bind error" << endl;
 74         perror("bind error");
 75         return -1;
 76     }
 77     
 78     if( listen(listenfd,5) < 0 )
 79     {
 80         cout << "listen error" << endl;
 81         return -1;
 82     }
 83     
 84     i = 0;
 85 
 86     //confd = accept(listenfd,(struct sockaddr*)NULL,NULL);
 87     while(1)
 88     {
 89         confd = accept(listenfd,(struct sockaddr*)NULL,NULL);
 90         if( confd < 0)
 91         {
 92             cout << "accept error" << endl;
 93             return -1;
 94         }
 95         pid_t pid;
 96         pid = fork();
 97         if( pid == 0)
 98         {
 99             close(listenfd);
100             cout << "child" << endl;
101         send(confd,bs_x,sizeof(bs_x),0);
102         send(confd,bs_y,sizeof(bs_y),0);
103         send(confd,tdoa[i],sizeof(tdoa[i]),0);
104         //close(confd);
105         break;
106         }
107         cout << "parent" << endl;
108         close(confd);
109         
110      i++;
111      sleep(500);
112     }
113     cout << "child exit" << endl;
114     close(confd);
115     return 0;
116 }
bubuko.com,布布扣

客户端:

bubuko.com,布布扣
 1 #include <sys/types.h>
 2 #include <sys/socket.h>
 3 #include <netinet/in.h>
 4 #include <arpa/inet.h>
 5 #include <unistd.h>
 6 #include <stdio.h>
 7 #include <stdlib.h>
 8 #include <string.h>
 9 #include <fstream>
10 #include <sstream>
11 #include <iostream>
12 using namespace std;
13 
14 int main()
15 {
16     struct data
17     {
18         double bs_x[5];
19         double bs_y[5];
20         double tdoa[4];
21     }data_t;
22     struct data revdata;
23     char buf[100];
24     int sockfd;
25     struct sockaddr_in addr;
26     
27     sockfd = socket(AF_INET,SOCK_STREAM,0);
28     
29     bzero(&addr,sizeof(addr));
30     addr.sin_family = AF_INET;
31     addr.sin_addr.s_addr = inet_addr("127.0.0.1");
32     addr.sin_port = htons(9999);
33     
34     if( connect(sockfd,(struct sockaddr*)&addr,sizeof(addr)) < 0)
35     {
36         cout << "connect error" << endl;
37         return -1;
38     }
39     
40     struct sockaddr_in testaddr;
41     bzero(&testaddr,sizeof(testaddr));
42     getsockname(sockfd,(struct sockaddr*)&testaddr,NULL);
43     char bbb[50];
44     inet_ntop(AF_INET,&testaddr.sin_addr,bbb,sizeof(testaddr));
45     cout << bbb << endl;
46     cout << ntohs(testaddr.sin_port) << endl;
47     while(1)                                            //死循环
48     {
49     //menset(&buf,sizeof(buf));
50     if( recv(sockfd,buf,sizeof(revdata),MSG_WAITALL) < 0)  //当服务器端断开连接时,recv失效
51     {
52         cout << "recieve msg erro" << endl;
53         return -1;
54     }
55     
56     bzero(&revdata,0);
57     memcpy(&revdata,buf,sizeof(revdata));
58 
59     
60     for(int i = 0; i < 4; i++)                //但是这里一直在死循环中输出
61     {
62         printf("[%d]\t",i+1);
63         cout << revdata.bs_x[i] <<" "
64             << revdata.bs_y[i] << " "
65             << revdata.tdoa[i] << endl;
66     }
67     }
68     close(sockfd);
69     return 0;
70     
71 }
bubuko.com,布布扣

 因为recv在客户端的死循环中,当服务端断开连接时,recv失效

SOCKET编程:为什么recv不阻塞,布布扣,bubuko.com

SOCKET编程:为什么recv不阻塞

原文:http://www.cnblogs.com/chenweian/p/3619099.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!