c++ - 编写客户端和服务器,UDP

标签 c++ c sockets udp

我正在尝试使用 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("%d\n", 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
}

关于c++ - 编写客户端和服务器,UDP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23394188/

相关文章:

c++ - 如何在 qt webengine 中禁用 CSP?

c++ - 动态地向一组中的一个对象发射信号

c - 我试图在 thread_func 调用中通过 for 循环的每次传递请求打印线程数

c - 具有 libmodbus 的多个 RS485 从机

c++ - new/malloc 似乎如何记住分配的数据量?

C++ 正则表达式

c - 有理数转换为long int

Java - Socket.writeObject() 真的很慢

c# - C#套接字服务器如何取消卡在socket.accept()中的线程

c - 为accept()系统调用工作