编写客户端和服务器,UDP

Writing Client and Server, UDP

本文关键字:UDP 服务器 客户端      更新时间:2023-10-16

我正在尝试使用UDP编写一个简单的客户端和服务器。

我可以将数据从客户端发送到服务器,服务器接收得很好,但当我将数据从服务器发送到客户端时,它根本不起作用。。。(它没有检测到任何东西,并且卡在recvfrom功能上。

这是我的服务器代码:

SOCKET ServerOn()
 {
SOCKET ListenSocket;
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR)
{
    exit(0);
}
// Create a SOCKET for listening for
// incoming connection requests.
ListenSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (ListenSocket == INVALID_SOCKET) 
{
    WSACleanup();
    exit(1);
}
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("0.0.0.0");
service.sin_port = htons(2583);
if (bind(ListenSocket,(SOCKADDR *) & service, sizeof (service)) == SOCKET_ERROR) 
{
    closesocket(ListenSocket);
    WSACleanup();
    exit(2);
}
return ListenSocket;
}

在这个函数中,我正在初始化端口2583上的服务器。

这是我在服务器中的另一个代码:

int size = sizeof(service);
char *data = new char[500];
recvfrom(s,data, 500, NULL, (SOCKADDR*)&service, &size); // Getting a new connection
    sockaddr_in service;
 service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("10.0.0.1");
service.sin_port = htons(2583);
    int addrSize = sizeof(service);
if (sendto(s, "123", 3, NULL, (struct sockaddr*)&service, addrSize) != 3)
    printf("%d", WSAGetLastError()); // Print error if did not send successfully

"10.0.0.1"是客户端的IP(我确定它是(。。。我没有找到从插座自动获取IP的方法,所以我现在只是把它放在一边。。。

这是我的客户代码:

SOCKET ConnectToServer()
{
//----------------------
// Initialize Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) 
{
    return NULL;
}
//----------------------
// Create a SOCKET for connecting to server
SOCKET ConnectSocket;
ConnectSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (ConnectSocket == INVALID_SOCKET)
{
    WSACleanup();
    return NULL;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr(Default_IP.c_str()); // IP
clientService.sin_port = htons(Default_Port); // Port
//----------------------
// Connect to server.
iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService)); // Connecting
while (iResult == SOCKET_ERROR) // ERROR, could not connect. keep trying
{
    iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService)); // Connecting
}
   return ConnectSocket;
    }

在这段代码中,我连接到客户端。

这是客户端代码的其余部分:

    sockaddr_in service;
 service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("10.0.0.1");
service.sin_port = htons(2583);
s = ConnectToServer();
sendto(s, "123", 3, NULL, (struct sockaddr*)&service, addrSize);
while(true)
{
    result = recvfrom(s, (char*)waveIn, NUMPTS * sizeof(short int), NULL, (struct sockaddr *)&service, &addrSize);
    if (result > 0)
    {
        std::cout << "New Data!" << std::endl;
    }
    else
        printf("%dn", WSAGetLastError());
}

客户端中的sendto函数确实起作用,服务器收到了它,尽管当服务器试图将数据发送回客户端时,它什么也没收到,并且它被困在recvfrom函数上。

我做错了什么?

p.S-我在同一台计算机上运行客户端和服务器,这意味着两者都有相同的IP地址("10.0.0.1"(,但在使用带有TCP的套接字时,它一直对我有效,所以我在这里也这样做了。

尽管如此,我确实尝试在两台不同的计算机上使用了这个代码,但我仍然有同样的错误。。。

谢谢!

当服务器调用recvfrom()时,它会报告数据来自的IP:Port。你需要将你的回复发送回同一个IP:Port,例如:

sockaddr_in service;
int size = sizeof(service);
char data[500];
int len = recvfrom(s, data, 500, NULL, (SOCKADDR*)&service, &size);
if (len == -1)
    printf("recv failed: %d", WSAGetLastError()); // Print error if did not recv successfully
else
{
    if (sendto(s, "123", 3, NULL, (struct sockaddr*)&service, size) == -1)
        printf("send failed: %d", WSAGetLastError()); // Print error if did not send successfully
}