UDP-клиент не может отправить сообщение на сервер, но может получить - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь создать клиент UDP.Когда я пытаюсь отправить сообщение на сервер, я получаю сообщение об ошибке WSAEOPNOTSUPP.Но последующий вызов recvfrom, кажется, работает нормально.У меня еще не было возможности протестировать его на сервере, поэтому я предполагаю, что данные вернутся, как и ожидалось.В соответствии с документацией это означает, что ошибка означает

MSG_OOB, но сокет не является потоковым, например, тип SOCK_STREAM, данные OOB не поддерживаются в области связи, связанной с этим сокетом, или в сокетеявляется однонаправленным и поддерживает только операции приема.

Вот код (очищенный для вашей защиты)

WORD version = MAKEWORD(2, 2);
WSADATA data;
int error = 0;

if ((error = WSAStartup(version, &data)) != NO_ERROR)
{
    kzLogError(KZ_LOG_CATEGORY_GENERIC, ("Error: WSAStartup failed with error: {}", error));
    return;
}

if (LOBYTE(data.wVersion) != 2 || HIBYTE(data.wVersion) != 2)
{
    kzLogError(KZ_LOG_CATEGORY_GENERIC, ("Error: System could not support WinSock 2.2."));

    if (WSACleanup() == SOCKET_ERROR)
    {
        kzLogError(KZ_LOG_CATEGORY_GENERIC, ("Error: Winsock cleanup error: {}", WSAGetLastError()));
    }
    return;
}

SOCKET s = INVALID_SOCKET;

if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET)
{
    kzLogError(KZ_LOG_CATEGORY_GENERIC, ("Error: Socket creation failed with error: {}", WSAGetLastError()));

    if (WSACleanup() == SOCKET_ERROR)
    {
        kzLogError(KZ_LOG_CATEGORY_GENERIC, ("Error: Winsock cleanup error: {}", WSAGetLastError()));
    }
    return;
}

int bytesRecv = 0;
ReceiveData receiveData;
struct sockaddr_in server_addr;
int server_addr_len = sizeof(server_addr);

memset((char *)&server_addr, 0, server_addr_len);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(2010);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

memset((char *)&receiveData, 0, sizeof(ReceiveData));

if (sendto(s, “hello”, strlen(“hello”), 0, (struct sockaddr *) &server_addr, server_addr_len) == SOCKET_ERROR)
{
    kzLogError(KZ_LOG_CATEGORY_GENERIC, ("Error: unable to send hello to server: {}", WSAGetLastError()));
}

while (bytesRecv != SOCKET_ERROR)
{
    bytesRecv = recvfrom(s, (char*)&receiveData, sizeof(ReceiveData), 0, (struct sockaddr *) &server_addr, &server_addr_len);
    if (bytesRecv > 0)
    {
        // parse the data
    }
    else
    {
        if (bytesRecv == SOCKET_ERROR)
        {
            kzLogError(KZ_LOG_CATEGORY_GENERIC, ("Error: Reading data: {}", WSAGetLastError()));
        }
    }
}

if (closesocket(s) == SOCKET_ERROR)
{
    kzLogError(KZ_LOG_CATEGORY_GENERIC, ("Error: Unable to close socket: {}", WSAGetLastError()));
}

if (WSACleanup() == SOCKET_ERROR)
{
    kzLogError(KZ_LOG_CATEGORY_GENERIC, ("Error: Winsock cleanup error: {}", WSAGetLastError()));
}
...