Dziwna sytuacja z winsock – serwer zwraca błąd, mimo poprawnego połączenia się

0

Witam forumowiczów,

od kilku dni zmagam się (pewnie jak się okaże - banalnym) problemem z biblioteką winsock2.h.

Otóż serwer ciągle zwraca błąd, mimo poprawnego połączenia się i nie wyświetla mojej wiadomości. Co więcej, przy sztucznym wywołaniu błędu w kodzie serwera okazało się, że ten ciągle "słucha" i wywala ten błąd gdy otrzymuje wiadomość (oczywiście kod podaję bez improwizowanego błędu).

Oto moje wypociny. Proszę nie zwracać uwagi na gdzieniegdzie brak kontroli błędów i ogólny bałagan w kodzie. Napisałem tylko, żeby zobaczyć, czy to w ogóle działa.

//Server
 
#define  _WINSOCK_DEPRECATED_NO_WARNINGS
 
#include <Winsock2.h>
#include <iostream>
 
#define DEFAULT_PORT 12018
#define HIDE_CONSOLE_WINDOW true
 
int main()
{
    int iResult;
    //Winsock Startup
    WSAData wsaData;
    WORD DllVersion = MAKEWORD(2, 1);
    if (WSAStartup(DllVersion, &wsaData) != 0)
    {
        MessageBoxA(NULL, "Winsock startup failed!", "ERROR", MB_OK | MB_ICONERROR);
        exit(1);
    }
 
    SOCKADDR_IN addr;
    int addrlen = sizeof(addr);
    addr.sin_addr.s_addr =  inet_addr("192.168.100.2");
    addr.sin_port = htons(DEFAULT_PORT);
    addr.sin_family = AF_INET;
    memset( &( addr.sin_zero ), '\0', 8 );
 
    SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL);
    bind(sListen, (SOCKADDR*)&addr, sizeof(addr));
    listen(sListen, SOMAXCONN);
 
    SOCKET newConnection;
 
    newConnection = accept(sListen, (SOCKADDR*)&addr, &addrlen);
    if (newConnection == 0)
    {
        std::cout << "Failed to accept the client's connection" << std::endl;
    }
 
    char recBuf[256] = "";
        do
        {
            iResult = recv(sListen, (char*)recBuf, sizeof(recBuf), NULL);
            Sleep(100);
            std::cout<<recBuf<<std::endl;
 
           /* if (iResult > 0)
            {
                std::cout<<"Bytes received: "<< iResult<<std::endl;
                break;
            }
            else if (iResult == 0)
                std::cout<<"Connection closed "<< iResult<<std::endl;
           // else
             //   std::cout<<"recv failed "<< iResult<<std::endl;
             */
        }
        while (iResult==-1);
 
    system("pause");
    return 0;
}
0

Kodu nie sprawdzalem, przetestuj najpierw czy zadziala Ci z 127.0.0.1.

0
several napisał(a):

Kodu nie sprawdzalem, przetestuj najpierw czy zadziala Ci z 127.0.0.1.

Niestety, nie.

0

Spojrzalem w kod. Za duzo bledow zeby chcialo mi sie je wypisywac na telefonie. Serwer nue wysyla nic do klienta, bledny warunek w while i pewnie bym cos jeszcze znalazl widzac to na normalnym ekranie. BJ's guide to network programming, tam znajdziesz wszystkie odpowiedzi.

0

Spodziewałem się dużej ilości błędów. Z biblioteką pracuję dosłownie kilka dni, na podstawie jakiegoś krótkiego kursu.

1

Dziękuję Ci za pomoc. Problem rozwiązałem już sam. Otóż okazało się, że do funkcji recv() powinienem podać deskryptor gniazda otrzymany przy wywołaniu accept().

Pozdrawiam forum. Błąd był prosty, ale może ktoś tu trafi i nie będzie musiał dłubać tyle co ja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1