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

作者: s890269 (賽)   2016-11-03 03:25:21
開發平台(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):
作者: asilzheng (asil)   2016-11-03 05:40:00
s1根本addrsend是要送往哪裡啊漏字,根本不知道
作者: noodleT (麵T)   2016-11-04 07:45:00

Links booklink

Contact Us: admin [ a t ] ucptt.com