[問題] UDP client發送接收分兩個檔案寫

看板C_and_CPP (C/C++)作者 (賽)時間9年前 (2016/11/03 03:25), 編輯推噓2(202)
留言4則, 2人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Win7 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) Microsoft Visual Studio C++ 問題(Question): 我之前有寫過UDP Server以及UDP Client的函式,當時是把接收跟發送 都放在同一個Client裡,共兩個C++檔案 現在我想將Client裡的發送跟接收分開來,加上Server,總共會有三個C++檔案 現在的情況是,Server可以連到Client的發送端,但卻連不到Client的接收端 預期的正確結果(Expected Output): Server可以和兩個Client都連接上並傳輸封包 錯誤結果(Wrong Output): Server只跟Client發送端連接上,沒跟Client接收端連接上 程式碼(Code):(請善用置底文網頁, 記得排版) 大致簡單講一下程式碼,再附上詳細內容 Server.Cpp: 建了兩個socket s s1,並且有兩個PORT,一個為8888,一個為8889 8888和和發送端連,8889和接收端連,兩個socket都有綁定,所以不太知道問題點在哪裡 是我的接收端不能一開始就等待接收?但這樣好像又有點怪 附上程式碼: Server端 ///server//// #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #include <iostream> #include <sys/types.h> using namespace std; #pragma comment(lib,"ws2_32.lib") //Winsock Library #define SERVER_PORT 8888////給發送端 #define SERVER_PORT1 8889///給接收端 #define BUFLEN 1024 int _tmain(int argc, _TCHAR* argv[]){ struct sockaddr_in addr , si_other1; //address of this service *///for one port struct sockaddr_in addrsend , si_other2; SOCKET s; SOCKET s1; int length_addr; int length_addrsend; char buf[BUFLEN]; int sendbol; int receivebol; WSADATA wsa; printf("\nInitializing Winsock..."); if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){ printf("Failed. Error Code : %d",WSAGetLastError()); //exit(EXIT_FAILURE); } printf("Initialized.\n"); if ((s = socket(AF_INET, SOCK_DGRAM, 0)) <0){ perror ("socket failed"); //exit(EXIT_FAILURE); } if ((s1= socket(AF_INET, SOCK_DGRAM, 0)) <0){ perror ("socket failed"); //exit(EXIT_FAILURE); } memset(&addr,'\0',sizeof(addr)); memset(&addrsend,'\0',sizeof(addrsend)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(SERVER_PORT); addrsend.sin_family = AF_INET; addrsend.sin_addr.s_addr = htonl(INADDR_ANY); addrsend.sin_port = htons(SERVER_PORT1); if (bind(s,(struct sockaddr*)&addr,sizeof(addr)) <0) { perror ("bind failed\n"); } if (bind(s1,(struct sockaddr*)&addrsend,sizeof(addrsend)) <0) { perror ("bind failed\n"); } printf("bind done"); length_addr=sizeof(addr); length_addrsend=sizeof(addrsend); printf("Server is ready to receive !!\n"); printf("Can strike Cntrl-c to stop Server >>\n"); memset(buf,'\0', BUFLEN); while(1){ receivebol=recvfrom(s,buf,BUFLEN,0,(struct sockaddr*)&addr ,&length_addr); if (receivebol<0){ perror ("could not read datagram!!"); continue; } printf("Received data form %s : %d\n",inet_ntoa(addr.sin_addr), htons(addr.sin_port)); printf("%s\n",buf); sendbol=sendto(s1,buf,BUFLEN,0, (struct sockaddr*)&addrsend, length_addrsend); if (sendbol<0){ perror("Could not send datagram!!\n"); continue; } printf("Can Strike Crtl-c to stop Server >>\n"); } memset(buf,'\0',BUFLEN); closesocket(s); closesocket(s1); WSACleanup(); system("pause"); return 0; } Client發送端: ///client/send//// #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <winsock2.h> #include <fcntl.h> #include <string.h> #include <iostream> #include <cstdio> #include <cassert> #include <cmath> #include <math.h> #include <time.h> #pragma comment(lib,"ws2_32.lib") using namespace std; #define SERV_PORT 8888 //send to server #define BUFLEN 1024 #define SERVER "127.0.0.1" int main(int argc, char **argv){ struct sockaddr_in server;//one port struct hostent *hp; /* holds IP address of server */ SOCKET s; int size_server; char data; char buf[BUFLEN]={0}; double cur_ang[3]; int sendbol, receivebol; WSADATA wsa; //Initialise winsock printf("\nInitializing Winsock..."); if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){ printf("Failed. Error Code : %d",WSAGetLastError()); //exit(EXIT_FAILURE); } printf("Initialized.\n"); //create socket if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR){ printf("socket() failed with error code : %d" , WSAGetLastError()); //exit(EXIT_FAILURE); } server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_addr.s_addr=inet_addr(SERVER); server.sin_port = htons(SERV_PORT); size_server=sizeof(server); cur_ang[0]=0.5678; cur_ang[1]=0.51278; cur_ang[2]=0.589678; while(1){ sprintf(buf,"%f %f %f ",cur_ang[0],cur_ang[1],cur_ang[2]); printf("%s\n",buf); sendbol=sendto(s,buf,BUFLEN,0,(struct sockaddr*)&server,size_server); if(sendbol<0) { perror("sned to server error !"); //Sleep(2000); //exit(1); } else{ printf("bytes have been sended\n"); } memset(buf,'\0',sizeof(buf)); } closesocket(s); WSACleanup(); system("pause"); return 0; } Client接收端: ///client//receive/// #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <winsock2.h> #include <fcntl.h> #include <string.h> #include <iostream> #include <cstdio> #include <cassert> #include <cmath> #include <math.h> #include <time.h> #pragma comment(lib,"ws2_32.lib") using namespace std; #define SERV_PORT 8889 //receive from server #define BUFLEN 1024 #define SERVER "127.0.0.1" int main(int argc, char **argv){ struct sockaddr_in server;//one port struct hostent *hp; /* holds IP address of server */ SOCKET s; int size_server; char data; char buf[BUFLEN]={0}; char buf1[BUFLEN]={0}; int sendbol, receivebol; WSADATA wsa; //Initialise winsock printf("\nInitializing Winsock..."); if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){ printf("Failed. Error Code : %d",WSAGetLastError()); //exit(EXIT_FAILURE); } printf("Initialized.\n"); //create socket if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR){ printf("socket() failed with error code : %d" , WSAGetLastError()); //exit(EXIT_FAILURE); } server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_addr.s_addr=inet_addr(SERVER); server.sin_port = htons(SERV_PORT); size_server=sizeof(server); while(1){ receivebol=recvfrom(s,buf,BUFLEN,0,(struct sockaddr*)&server ,&size_server); if (receivebol< 0) { printf("receive failed: %d\n" , WSAGetLastError()); } else{ printf("bytes have been received\n"); printf("%s\n",buf); } memset(buf,'\0',sizeof(buf)); } closesocket(s); WSACleanup(); system("pause"); return 0; } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.10.38.124 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1478114724.A.010.html

11/03 05:40, , 1F
s1根本addrsend是要送往哪裡啊
11/03 05:40, 1F

11/03 05:41, , 2F
漏字,根本不知道
11/03 05:41, 2F

11/04 07:45, , 3F
goo.gl/RhTbvN
11/04 07:45, 3F

11/04 07:47, , 4F
11/04 07:47, 4F
文章代碼(AID): #1O6Zsa0G (C_and_CPP)
文章代碼(AID): #1O6Zsa0G (C_and_CPP)