当前位置:实例文章 » 其他实例» [文章]服务器使用UDP通讯127.0.0.1测试成功连接服务器却通讯失败

服务器使用UDP通讯127.0.0.1测试成功连接服务器却通讯失败

发布人:shili8 发布时间:2024-12-28 10:51 阅读次数:0

**服务器使用UDP通讯127.0.0.1测试成功连接服务器却通讯失败**

在网络编程中,UDP(User Datagram Protocol)是一种常见的传输协议,它提供了一个简单、快速的方式来进行数据交换。然而,在某些情况下,使用UDP通讯可能会遇到一些问题,尤其是在测试阶段。

本文将介绍如何在服务器上使用UDP通讯127.0.0.1(localhost)进行测试,并解释为什么测试成功连接服务器却通讯失败的原因。

**测试环境**

* 操作系统:Windows10*语言:C++
* 库:Winsock2**测试代码**

cpp#include 
#include 

#pragma comment(lib, "ws2_32.lib")

int main()
{
 // 初始化 WinSock WSADATA wsaData;
 WSAStartup(MAKEWORD(2,2), &wsaData);

 // 创建 UDP 套接字 SOCKET udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 if (udpSocket == INVALID_SOCKET)
 {
 printf("创建 UDP 套接字失败!
");
 WSACleanup();
 return -1;
 }

 // 设置服务器地址 sockaddr_in serverAddress;
 serverAddress.sin_family = AF_INET;
 serverAddress.sin_port = htons(12345);
 inet_pton(AF_INET, "127.0.0.1", &serverAddress.sin_addr);

 // 发送数据 char* sendData = "Hello, Server!";
 int sendLen = strlen(sendData) +1; // 加上 '0' 的长度 if (sendto(udpSocket, sendData, sendLen,0, (sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR)
 {
 printf("发送数据失败!
");
 closesocket(udpSocket);
 WSACleanup();
 return -1;
 }

 // 等待服务器回复 char receiveData[1024];
 int receiveLen = recvfrom(udpSocket, receiveData,1024,0, NULL, NULL);
 if (receiveLen == SOCKET_ERROR)
 {
 printf("等待服务器回复失败!
");
 closesocket(udpSocket);
 WSACleanup();
 return -1;
 }

 // 输出接收到的数据 printf("Server 回复:%s
", receiveData);

 // 关闭套接字 closesocket(udpSocket);
 WSACleanup();

 return0;
}


**测试结果**

在上述代码中,我们尝试使用UDP通讯127.0.0.1(localhost)进行测试。测试成功连接服务器却通讯失败的原因是因为我们没有正确设置服务器地址。

在 `serverAddress.sin_addr` 中,我们使用了 `inet_pton(AF_INET, "127.0.0.1", &serverAddress.sin_addr);` 来设置服务器地址,但是这个函数并没有将 IP 地址转换为二进制形式,而是直接将字符串 "127.0.0.1" 复制到了 `serverAddress.sin_addr` 中。

因此,实际上我们并没有正确设置服务器地址,这导致了测试失败。

**解决方案**

要解决这个问题,我们需要使用 `inet_pton(AF_INET, "127.0.0.1", &serverAddress.sin_addr);` 来将 IP 地址转换为二进制形式,然后再将其赋值给 `serverAddress.sin_addr`。

下面是修改后的代码:

cpp#include 
#include 

#pragma comment(lib, "ws2_32.lib")

int main()
{
 // 初始化 WinSock WSADATA wsaData;
 WSAStartup(MAKEWORD(2,2), &wsaData);

 // 创建 UDP 套接字 SOCKET udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 if (udpSocket == INVALID_SOCKET)
 {
 printf("创建 UDP 套接字失败!
");
 WSACleanup();
 return -1;
 }

 // 设置服务器地址 sockaddr_in serverAddress;
 serverAddress.sin_family = AF_INET;
 serverAddress.sin_port = htons(12345);
 in_addr serverIp;
 inet_pton(AF_INET, "127.0.0.1", &serverIp);
 memcpy(&serverAddress.sin_addr, &serverIp, sizeof(serverIp));

 // 发送数据 char* sendData = "Hello, Server!";
 int sendLen = strlen(sendData) +1; // 加上 '0' 的长度 if (sendto(udpSocket, sendData, sendLen,0, (sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR)
 {
 printf("发送数据失败!
");
 closesocket(udpSocket);
 WSACleanup();
 return -1;
 }

 // 等待服务器回复 char receiveData[1024];
 int receiveLen = recvfrom(udpSocket, receiveData,1024,0, NULL, NULL);
 if (receiveLen == SOCKET_ERROR)
 {
 printf("等待服务器回复失败!
");
 closesocket(udpSocket);
 WSACleanup();
 return -1;
 }

 // 输出接收到的数据 printf("Server 回复:%s
", receiveData);

 // 关闭套接字 closesocket(udpSocket);
 WSACleanup();

 return0;
}


在上述代码中,我们使用 `inet_pton(AF_INET, "127.0.0.1", &serverIp);` 来将 IP 地址转换为二进制形式,然后再将其赋值给 `serverAddress.sin_addr`。

这样就可以正确设置服务器地址了。

相关标签:运维服务器
其他信息

其他资源

Top