编写客户端和服务器,UDP

时间:2014-04-30 17:12:56

标签: 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上功能

我做错了什么?

PS - 我在同一台计算机上运行客户端和服务器,这意味着两者都具有相同的IP地址(&#34; 10.0.0.1&#34;),但在使用时它总是对我有用使用TCP的套接字,所以我也在这里做过。

虽然,我确实试过用2台不同的电脑使用这个代码,但我仍然有同样的错误......

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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
}