要求是两个虚拟机的代码之间能够互相通信用的是UDP协议(但是代码经常卡在serevr的recvfrom())
这个图片是设置的IP地址要通过这个来链接
这是server虚拟机的IP地址
这是client虚拟机的ip地址
这是server
#include <iostream>
#include <cstring>
#include <unistd.h> // For close function
#include <sys/socket.h>
#include <netinet/in.h> // For sockaddr_in structure
using namespace std; // This allows you to use standard library functions without the 'std::' prefix
int main() {
// Create server socket
int ServerSocket;
ServerSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Create a UDP socket
if (ServerSocket == -1) {
cerr << "ERROR: Failed to create ServerSocket" << endl;
return 1;
}
// Configure server address
sockaddr_in SvrAddr;
SvrAddr.sin_family = AF_INET;
SvrAddr.sin_addr.s_addr = INADDR_ANY;
SvrAddr.sin_port = htons(27000);
// Bind the socket
if (bind(ServerSocket, (struct sockaddr *)&SvrAddr, sizeof(SvrAddr)) == -1) {
close(ServerSocket);
cerr << "ERROR: Failed to bind ServerSocket" << endl;
return 1;
}
// Buffer for incoming data
char RxBuffer[128] = {};
sockaddr_in CltAddr;
socklen_t addr_len = sizeof(CltAddr);
// Receive data
int receivedSize = recvfrom(ServerSocket, RxBuffer, sizeof(RxBuffer), 0, (struct sockaddr*)&CltAddr, &addr_len);
if (receivedSize < 0) {
cerr << "ERROR: Failed to receive data" << endl;
close(ServerSocket);
return 1;
} else {
RxBuffer[receivedSize] = '\0'; // Ensure null-termination
cout << "Msg Rx: " << RxBuffer << endl;
}
// Send a response
char TxBuffer[128] = "Got It";
sendto(ServerSocket, TxBuffer, strlen(TxBuffer), 0, (struct sockaddr*)&CltAddr, sizeof(CltAddr));
// Cleanup
close(ServerSocket);
return 0;
}
这是client
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
#include <iostream>
using namespace std;
int main() {
// Create a UDP socket
int ClientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (ClientSocket < 0) {
cout << "ERROR: Failed to create Socket" << endl;
return 1;
}
// Specify the server address and port
struct sockaddr_in SvrAddr;
memset(&SvrAddr, 0, sizeof(SvrAddr)); // Clear structure
SvrAddr.sin_family = AF_INET;
SvrAddr.sin_port = htons(27500); // Server port
SvrAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Server IP address
// Send a message to the server
const char* sendBuffer = "Hello World";
ssize_t sendSize = sendto(ClientSocket, sendBuffer, strlen(sendBuffer), 0,
(struct sockaddr*)&SvrAddr, sizeof(SvrAddr));
if (sendSize < 0) {
cout << "Sending Failed" << endl;
close(ClientSocket);
return 1;
}
else {
cout << "Message Successfully Sent: " << sendBuffer << endl;
}
// Receive a message from the server
char recvBuffer[512];
socklen_t SvrAddrSize = sizeof(SvrAddr);
ssize_t recvSize = recvfrom(ClientSocket, recvBuffer, sizeof(recvBuffer) - 1, 0,
(struct sockaddr*)&SvrAddr, &SvrAddrSize);
if (recvSize < 0) {
cout << "Receiving Failed" << endl;
close(ClientSocket);
return 1;
}
else {
recvBuffer[recvSize] = '\0'; // Ensure null termination
cout << "Message Successfully Received: " << recvBuffer << endl;
}
// Cleanup: close socket
close(ClientSocket);
return 0;
}