服务器端:
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 }
客户端:
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 }
因为recv在客户端的死循环中,当服务端断开连接时,recv失效
SOCKET编程:为什么recv不阻塞,布布扣,bubuko.com
原文:http://www.cnblogs.com/chenweian/p/3619099.html