функция connect не видит ошибки UDP

219
23 июля 2021, 08:20

Как работает connect в UDP, он реагирует как то или нет?

этот код у меня не работает, он всегда пропускает ошибку, даже если сервер отключен. Можно заставить его ждать пока не включиться сервер или хотя бы выдать ошибку соединения?

for (AI = AddrInfo; AI != NULL; AI = AI->ai_next) {
    // Open a socket with the correct address family for this address.
    ConnSocket = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol);
    printf("socket call with family: %d socktype: %d, protocol: %d\n",
        AI->ai_family, AI->ai_socktype, AI->ai_protocol);
    if (ConnSocket == INVALID_SOCKET)
        printf("socket call failed with %d\n", WSAGetLastError());
    //**** DEBUG END
    if (ConnSocket == INVALID_SOCKET) {
        fprintf(stderr, "Error Opening socket, error %d: %s\n",
            WSAGetLastError(), PrintError(WSAGetLastError()));
        continue;
    }
    //
    // Notice that nothing in this code is specific to whether we 
    // are using UDP or TCP.
    //
    // When connect() is called on a datagram socket, it does not 
    // actually establish the connection as a stream (TCP) socket
    // would. Instead, TCP/IP establishes the remote half of the
    // (LocalIPAddress, LocalPort, RemoteIP, RemotePort) mapping.
    // This enables us to use send() and recv() on datagram sockets,
    // instead of recvfrom() and sendto().
    //
    printf("Attempting to connect to: %s\n", Server ? Server : "localhost");

    if (connect(ConnSocket, AI->ai_addr, (int)AI->ai_addrlen) != SOCKET_ERROR)
        break;
    i = WSAGetLastError();
    if (getnameinfo(AI->ai_addr, (int)AI->ai_addrlen, AddrName,
        sizeof(AddrName), NULL, 0, NI_NUMERICHOST) != 0)
        strcpy_s(AddrName, sizeof(AddrName), UNKNOWN_NAME);
    fprintf(stderr, "connect() to %s failed with error %d: %s\n",
        AddrName, i, PrintError(i));
    closesocket(ConnSocket);
}
if (AI == NULL) {
    fprintf(stderr, "Fatal error: unable to connect to the server.\n");
    WSACleanup();
    return -1;
}
Answer 1

В UDP протоколе нет понятия соединения. Протокол оперирует только понятием пакета. Соответственно вызов функции connect() не имеет смысла.

Для отправки/приема данных по UDP протоколу используют функции sendto()/recvfrom().

А еще в UDP протоколе нет подтверждения пакетов. Поэтому узнать обработал ли кто-то ваш пакет невозможно

READ ALSO
C++ поиск совпадения ключ-значения в map

C++ поиск совпадения ключ-значения в map

Вечер добрый! Есть std::map myMap, который я заполнил из filetxt файла(заполнился и отображается корректно) 1 qwerty 2 sef 3 hhhh

141
Не могу создать структуру

Не могу создать структуру

Не могу создать переменную структуруЕсли мы объявляем структуру в том же файле где и main функция, то все инициализируется нормально

452
Удаление Sprite со сцены cocos2d-x

Удаление Sprite со сцены cocos2d-x

При удалении спрайта функциями this->removeChild(sprite,true); или this->removeChildByTag(1) или sprite->removeFromParent(); вылетает играВ чём заключается проблема? Вроде...

224
Нужен SD_SEND для UDP соединения?

Нужен SD_SEND для UDP соединения?

Есть такой код, как я понял он полностью отключает соединения, мне интересно для чего его используют в UDP сетиИли его вообще не используют...

267