C++ C++;UDP客户端/套接字编程:can';不发送和接收
第一次来这里。我正在尝试实现一个UDP套接字客户端/服务器,以便在大学考试中与BGI合作。我想发送移动坐标并接收测试字符。但是当我使用recvfrom()时,它不起作用,没有它也可以。对不起,我的英语不好 以下是客户端文件:C++ C++;UDP客户端/套接字编程:can';不发送和接收,c++,sockets,bgi,C++,Sockets,Bgi,第一次来这里。我正在尝试实现一个UDP套接字客户端/服务器,以便在大学考试中与BGI合作。我想发送移动坐标并接收测试字符。但是当我使用recvfrom()时,它不起作用,没有它也可以。对不起,我的英语不好 以下是客户端文件: #define WIN32_LEAN_AND_MEAN #include<winsock2.h> #include<windows.h> #include<string> #include<stdio.h> #include
#define WIN32_LEAN_AND_MEAN
#include<winsock2.h>
#include<windows.h>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<graphics.h>
#define SIZE 512
#define PORT 20252
#define SERVER_IP "127.0.0.1"
#define CLIENT_IP "127.0.0.1"
using namespace std;
int main() {
WSADATA wsaData;
SOCKET ClientSocket;
int server_length;
struct sockaddr_in server;
struct sockaddr_in client;
char print_buffer[SIZE];
/* ==================================================================================*/
WSAStartup(0x0101, &wsaData);
ClientSocket = socket(AF_INET, SOCK_DGRAM, 0);
memset((void *)&server, '\0', sizeof(struct sockaddr_in));
memset((void *)&client, '\0', sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(SERVER_IP);
client.sin_family = AF_INET;
client.sin_port = htons(PORT);
client.sin_addr.s_addr = inet_addr(CLIENT_IP);
bind(ClientSocket, (struct sockaddr *)&client, sizeof(struct sockaddr_in));
/* ==================================================================================*/
int x = 0;
while (x != 1) {
server_length = sizeof(struct sockaddr_in);
if (GetKeyState(VK_RIGHT)&0x80) {
char send_right_P1[SIZE] = "P1RIGHT\r\n";
sendto(ClientSocket, send_right_P1, (int)strlen(send_right_P1) + 1, 0, (struct sockaddr *)&server, server_length);
memset(&send_right_P1[0], 0, sizeof(send_right_P1));
}
if (GetKeyState(VK_LEFT)&0x80) {
char send_left_P1[SIZE] = "P1LEFT\r\n";
sendto(ClientSocket, send_left_P1, (int)strlen(send_left_P1) + 1, 0, (struct sockaddr *)&server, server_length);
memset(&send_left_P1[0], 0, sizeof(send_left_P1));
}
if (GetKeyState(VK_UP)&0x80) {
char send_up_P1[SIZE] = "P1UP\r\n";
sendto(ClientSocket, send_up_P1, (int)strlen(send_up_P1) + 1, 0, (struct sockaddr *)&server, server_length);
memset(&send_up_P1[0], 0, sizeof(send_up_P1));
}
if (GetKeyState(VK_DOWN)&0x80) {
char send_down_P1[SIZE] = "P1DOWN\r\n";
sendto(ClientSocket, send_down_P1, (int)strlen(send_down_P1) + 1, 0, (struct sockaddr *)&server, server_length);
memset(&send_down_P1[0], 0, sizeof(send_down_P1));
}
if (GetKeyState(VK_ESCAPE)&0x80) {
char send_escape[SIZE] = "ESCAPE\r\n";
sendto(ClientSocket, send_escape, (int)strlen(send_escape) + 1, 0, (struct sockaddr *)&server, server_length);
memset(&send_escape[0], 0, sizeof(send_escape));
}
recvfrom(ClientSocket, print_buffer, SIZE, 0, (struct sockaddr *)&server, &server_length);
if (strcmp(print_buffer, "TESTE\r\n" ) == 0) {
cout << print_buffer;
} else cout << "Failed\n";
memset(&print_buffer[0], 0, sizeof(print_buffer));
delay(50);
}
closesocket(ClientSocket);
WSACleanup();
return 0;
}
#定义WIN32_LEAN_和_MEAN
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义大小512
#定义端口20252
#定义服务器IP“127.0.0.1”
#定义客户端IP“127.0.0.1”
使用名称空间std;
int main(){
WSADATA WSADATA;
插座客户端插座;
int服务器长度;
服务器中的结构sockaddr_;
客户端中的结构sockaddr_;
字符打印缓冲区[大小];
/* ==================================================================================*/
WSAStartup(0x0101和wsaData);
ClientSocket=socket(AF_INET,SOCK_DGRAM,0);
memset((void*)和服务器,'\0',sizeof(struct sockaddr_in));
memset((void*)和client,'\0',sizeof(struct sockaddr_in));
server.sinu family=AF\u INET;
server.sin_port=htons(端口);
server.sin\u addr.s\u addr=inet\u addr(服务器IP);
client.sinu family=AF\u INET;
client.sin_port=htons(port);
client.sin\u addr.s\u addr=inet\u addr(client\u IP);
绑定(ClientSocket,(struct sockaddr*)和client,sizeof(struct sockaddru in));
/* ==================================================================================*/
int x=0;
while(x!=1){
服务器长度=sizeof(结构sockaddr\u in);
if(GetKeyState(VK_RIGHT)&0x80){
char send_right_P1[SIZE]=“P1RIGHT\r\n”;
sendto(ClientSocket,send_right_P1,(int)strlen(send_right_P1)+1,0,(struct sockaddr*)&服务器,服务器长度);
memset(&send_right_P1[0],0,sizeof(send_right_P1));
}
if(GetKeyState(VK_左)&0x80){
char send_left_P1[SIZE]=“P1LEFT\r\n”;
sendto(ClientSocket,send_left_P1,(int)strlen(send_left_P1)+1,0,(struct sockaddr*)&服务器,服务器长度);
memset(&send_left_P1[0],0,sizeof(send_left_P1));
}
if(GetKeyState(VK_UP)&0x80){
char send\u up\u P1[SIZE]=“P1UP\r\n”;
sendto(ClientSocket,send_up_P1,(int)strlen(send_up_P1)+1,0,(struct sockaddr*)&服务器,服务器长度);
memset(&send_up_P1[0],0,sizeof(send_up_P1));
}
if(GetKeyState(VK_向下)&0x80){
char send_down_P1[SIZE]=“P1DOWN\r\n”;
sendto(ClientSocket,send_down_P1,(int)strlen(send_down_P1)+1,0,(struct sockaddr*)&服务器,服务器长度);
memset(&send_down_P1[0],0,sizeof(send_down_P1));
}
if(GetKeyState(VK_ESCAPE)&0x80){
char send_escape[SIZE]=“escape\r\n”;
sendto(ClientSocket,send_escape,(int)strlen(send_escape)+1,0,(struct sockaddr*)&服务器,服务器长度);
memset(&send_escape[0],0,sizeof(send_escape));
}
recvfrom(ClientSocket,打印缓冲区,大小,0,(struct sockaddr*)和服务器,以及服务器长度);
if(strcmp(打印缓冲区,“TESTE\r\n”)==0){
cout不bind()
客户端上的套接字。将客户端套接字绑定到127.0.0.1:20252,然后将数据发送到同一地址:端口对
只需删除客户端代码中对bind()
的调用
另一个选项(也在客户端上)是绑定到端口0,这将分配一个未使用的端口
另外:检查来自bind()
、sendto()
、recvfrom()
等的返回值,如果失败,则显示错误代码
还有一个:调用前必须初始化recvfrom()
的长度参数。例如,在客户端中,您应该执行以下操作:
server_length = sizeof(server);
recvfrom(ClientSocket, print_buffer, SIZE, 0, (struct sockaddr *)&server, &server_length);
同样,在服务器端。尝试放置产生错误的最短源代码
server_length = sizeof(server);
recvfrom(ClientSocket, print_buffer, SIZE, 0, (struct sockaddr *)&server, &server_length);