C_and_CPP 板


LINE

開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1478114724.A.010.html
1F:推 asilzheng: s1根本addrsend是要送往哪裡啊 11/03 05:40
2F:→ asilzheng: 漏字,根本不知道 11/03 05:41
3F:推 noodleT: goo.gl/RhTbvN 11/04 07:45
4F:→ noodleT: https://goo.gl/RhTbvN 11/04 07:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP