Задать вопрос
@andrkkk

Как решить проблему с получением сообщений от клиента в winsock используя UDP?

Разбираюсь с winsock, в частности с udp протоколом. При принятии/ожидании сообщения выходит ошибка, хотя код весь практически с документации microsoft.
recvfrom выдает ошибку с кодом 10057. Вроде это связано с сокетом, хотя socket и bind проходят успешно.
Код сервера:
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
#include <WinSock2.h>
#include <string>
#pragma warning(disable: 4996)
#include <Ws2tcpip.h>
#include <stdio.h>

#define RED   "\x1B[31m"
#define GRN   "\x1B[32m"
#define RESET "\x1B[0m"
int main(int argc, char* argv[] )
{
    
    int iResult = 0;
    short Port = 5000;
    char RecvBuf[1024];
    int BufLen = 1024;

    // инициализируем библиотеки
    WSADATA wsaData;
    WORD DLLVersion = MAKEWORD(2, 2);

    // проверка на ошибку
    iResult = WSAStartup(DLLVersion, &wsaData);
    if (iResult != 0) {
        printf(RED "error" RESET);
        exit(1);
    }

    // создаем сокет 
    SOCKET sListen = socket(AF_INET, SOCK_STREAM, 0);
    // проверка на ошибку
    if (sListen == INVALID_SOCKET) {
        printf(RED "socket failed with error: %ld\n" RESET, WSAGetLastError());
        return 1;
    }
    
    // структура для хранения данных об отправителе
    SOCKADDR_IN SenderAddr;
    int SenderAddrSize = sizeof(SenderAddr);

    // заполняем структуру сокета
    SOCKADDR_IN addr;
    int sizeOfAddr = sizeof(addr);
    addr.sin_addr.s_addr = ADDR_ANY;
    addr.sin_port = htons(Port);
    addr.sin_family = AF_INET;
    
    

    iResult = bind(sListen, (SOCKADDR*)&addr, sizeof(addr));
    // проверка на ошибку 
    if (iResult == SOCKET_ERROR) {
        printf(RED "bind failed with error: %d\n" RESET, WSAGetLastError());
        return 1;
    }

    printf(GRN "Server has been started\n" RESET);

    do {

        ZeroMemory(RecvBuf, BufLen);

        iResult = recvfrom(sListen, RecvBuf, 1024, 0, (SOCKADDR*)&SenderAddr, &SenderAddrSize);
        if (iResult == SOCKET_ERROR) {
            printf(RED "recvfrom failed with error: %d\n" RESET, WSAGetLastError());
        }  

        printf("Received message from %s: %s\n", inet_ntoa(SenderAddr.sin_addr), RecvBuf);
        printf(RecvBuf);
        
    } while (iResult > 0);


    closesocket(sListen);

    system("pause");
    return 0;
}
  • Вопрос задан
  • 272 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 2
15432
@15432
Системный программист ^_^
Так у вас же создаётся TCP (SOCK_STREAM) сокет, для которого нельзя recvfrom

Вам нужен SOCK_DGRAM
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вы используете SOCK_STREAM, который предназначен для TCP и требует предварительной установки соединения (listen/connect).
UDP работает через датаграммы, SOCK_DGRAM.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы