На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > WinSock с ошибкой 10061 , Проблема WSAConnect падает с ошибкой 10061
      Помогите найти ошибку.
      И клиент и сервер находятся на одной машине. Сеть отключена. Брендмауэр отключен. Операционная система Win 8.1. Ошибка происходит постоянно.

      This client side :
      ExpandedWrap disabled
        #include "stdafx.h"
        #include <iostream>
        #include <clocale>
        #include <conio.h>
         
        using namespace std;
         
        bool Nonblocking(SOCKET fd)
        {
            u_long arg = 1;
            return (::ioctlsocket(fd, FIONBIO, &arg) == 0);
        }
         
        // Disable blocking send/recv calls.
        bool Blocking(SOCKET fd)
        {
            u_long arg = 0;
            return (::ioctlsocket(fd, FIONBIO, &arg) == 0);
        }
         
        bool is_connected(int sock)
        {
            char buf;
            int err = recv(sock, &buf, 1, MSG_PEEK);
            return err == -1 ? false : true;
        }
         
        void checkRecvEvent(WSANETWORKEVENTS NetworkEvents)
        {
            switch (NetworkEvents.lNetworkEvents)
            {
            case FD_READ:  
                printf("Socket recived event FD_READ.\n");
                break;
            case FD_WRITE:
                printf("Socket recived event FD_WRITE.\n");
                break;
            case FD_OOB:
                printf("Socket recived event FD_OOB.\n");
                break;
            case FD_ACCEPT:
                printf("Socket recived event FD_ACCEPT.\n");
                break;
            case FD_CONNECT:
                printf("Socket recived event FD_CONNECT.\n");
                break;
            case FD_CLOSE:
                printf("Socket recived event FD_CLOSE.\n");
                break;
            case FD_QOS:
                printf("Socket recived event FD_QOS.\n");
                break;
            case FD_GROUP_QOS:
                printf("Socket recived event FD_GROUP_QOS.\n");
                break;
            case FD_ROUTING_INTERFACE_CHANGE:
                printf("Socket recived event FD_ROUTING_INTERFACE_CHANGE.\n");
                break;
            case FD_ADDRESS_LIST_CHANGE:
                printf("Socket recived event FD_ADDRESS_LIST_CHANGE.\n");
                break;
            case FD_ALL_EVENTS:
                printf("Socket recived event FD_ALL_EVENTS.\n");
                break;
            default:
                printf("We are not known this event.\n");
         
            }
        }
         
        int _tmain(int argc, _TCHAR* argv[])
        {
            WSAData wsaData;
            const char ConnectIP[20] = "127.0.0.1";
            int errCode = 0;
            struct sockaddr_in addr, addr1;
            int iClientSize = sizeof(sockaddr);
            DWORD EventTotal = 0;
            WSANETWORKEVENTS NetworkEvents;
            WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];
         
            memset(&addr, 0, sizeof(sockaddr_in));
            memset(&addr1, 0, sizeof(sockaddr_in));
         
            if (WSAStartup(0x0202, &wsaData) != 0){
                return -1;
            }
         
            for (int i = 0; i < WSA_MAXIMUM_WAIT_EVENTS; i++)
                EventArray[i] = WSA_INVALID_EVENT;
         
            addr.sin_family = AF_INET;
            addr.sin_port = htons(5801);
            addr.sin_addr.s_addr = inet_addr(ConnectIP);
         
            SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
         
            addr1.sin_family = AF_INET;
            addr1.sin_port = htons(5802);
            addr1.sin_addr.s_addr = inet_addr(ConnectIP);
         
            SOCKET sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
            
            unsigned long sockArg = 1;
            if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&sockArg, sizeof(sockArg)) != 0)
            {
                errCode = WSAGetLastError();
                closesocket(sock);
                printf("setsockopt for sock failed. WSAGetLastError() = %ld\n", errCode);
            }
         
            if (setsockopt(sock1, SOL_SOCKET, SO_REUSEADDR, (const char*)&sockArg, sizeof(sockArg)) != 0)
            {
                errCode = WSAGetLastError();
                closesocket(sock1);
                printf("setsockopt for sock1 failed. WSAGetLastError() = %ld\n", errCode);
            }
         
            //bool sb = Nonblocking(sock);
            //sb = Nonblocking(sock1);
                
            EventArray[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
            WSAResetEvent(EventArray[0]);
            errCode = WSAEventSelect(sock, EventArray[0], FD_CONNECT);
            if (errCode == SOCKET_ERROR)
            {
                errCode = WSAGetLastError();
                printf("WSAEventSelect for sock failed. WSAGetLastError() = %ld\n", errCode);
            }
         
            
         
            EventArray[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
            WSAResetEvent(EventArray[1]);
            errCode = WSAEventSelect(sock1, EventArray[1], FD_CONNECT);
            if (errCode == SOCKET_ERROR)
            {
                errCode = WSAGetLastError();
                printf("WSAEventSelect for sock failed. WSAGetLastError() = %ld\n", errCode);
            }
            //memset(&addr1, 0, sizeof(sockaddr_in));
         
            errCode = WSAConnect(sock, (PSOCKADDR)&addr, sizeof(addr), NULL, NULL, NULL, NULL);
            errCode = WSAGetLastError();
         
            errCode = WSAConnect(sock1, (PSOCKADDR)&addr1, sizeof(addr1), NULL, NULL, NULL, NULL);
            errCode = WSAGetLastError();
         
            DWORD index = 0;
            while (EventTotal == 0)
            {
                index = ::WaitForMultipleObjects(2, EventArray, TRUE, WSA_INFINITE);
                memset(&NetworkEvents, 0, sizeof(WSANETWORKEVENTS));
                errCode = WSAEnumNetworkEvents(sock, EventArray[0], &NetworkEvents);
         
                printf("Socket 0:\n");
                checkRecvEvent(NetworkEvents);
         
                memset(&NetworkEvents, 0, sizeof(WSANETWORKEVENTS));
                errCode = WSAEnumNetworkEvents(sock1, EventArray[1], &NetworkEvents);
                printf("Socket 1:\n");
                checkRecvEvent(NetworkEvents);
         
                EventTotal = 2;
            }
            int num1;
         
            cout << "Test Client => Num1" << endl;
            cin >> num1;
         
            for (int i = 0; i < WSA_MAXIMUM_WAIT_EVENTS; i++)
            {
                if (EventArray[i] != WSA_INVALID_EVENT)
                    WSACloseEvent(EventArray[i]);
            }
            closesocket(sock);
            closesocket(sock1);
         
            return 0;
        }


      This server side:
      ExpandedWrap disabled
        #include "stdafx.h"
        #include <iostream>
        #include <clocale>
        #include <conio.h>
         
        using namespace std;
         
        int _tmain(int argc, _TCHAR* argv[])
        {
            WSAData wsaData;
            char ConnectIP[255] = "127.0.0.1";
            int errCode = 0;
            struct sockaddr_in addr,addr1;
            //char errStr[1000];
            SOCKET AcceptSocket;
            sockaddr destSockAddr;
            int iClientSize = sizeof(sockaddr);
            DWORD EventTotal = 0;
            WSANETWORKEVENTS NetworkEvents;
            WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];
         
            if (WSAStartup(0x0202, &wsaData) != 0){
                return -1;
            }
            
            for (int i = 0; i < WSA_MAXIMUM_WAIT_EVENTS; i++)
                EventArray[i] = WSA_INVALID_EVENT;
            addr.sin_family = AF_INET;
            addr.sin_port = htons(58001);
            //addr.sin_addr.s_addr = htonl(INADDR_ANY);
            inet_pton(AF_INET, ConnectIP, &addr.sin_addr);
            
            SOCKET sock = socket(addr.sin_family, SOCK_STREAM, IPPROTO_TCP);
         
            unsigned long sockArg = 1;
            if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&sockArg, sizeof(int)) != 0)
            {
                errCode = WSAGetLastError();
                closesocket(sock);
            }
         
            if (::bind(sock, (struct sockaddr *)&addr, sizeof(sockaddr_in)) == SOCKET_ERROR)
            {
                errCode = WSAGetLastError();
                closesocket(sock);
            }
         
            
            addr1.sin_family = AF_INET;
            addr1.sin_port = htons(58002);
            //addr1.sin_addr.s_addr = htonl(INADDR_ANY);
            inet_pton(AF_INET, ConnectIP, &addr1.sin_addr);
         
            SOCKET sock1 = socket(addr1.sin_family, SOCK_STREAM, IPPROTO_TCP);
         
            if (setsockopt(sock1, SOL_SOCKET, SO_REUSEADDR, (const char*)&sockArg, sizeof(int)) != 0)
            {
                errCode = WSAGetLastError();
                closesocket(sock1);
            }
         
            if (::bind(sock1, (struct sockaddr *)&addr1, sizeof(sockaddr_in)) == SOCKET_ERROR)
            {
                errCode = WSAGetLastError();
                closesocket(sock1);
            }
            
            //memset(&addr, 0, sizeof(sockaddr_in));
            errCode = ::listen(sock, SOMAXCONN);
            errCode = WSAGetLastError();
         
            errCode = ::listen(sock1, SOMAXCONN);
            errCode = WSAGetLastError();
         
            EventArray[0] = WSACreateEvent();
            WSAResetEvent(EventArray[0]);
            WSAEventSelect(sock, EventArray[0], FD_ACCEPT);
            EventTotal++;
         
            EventArray[1] = WSACreateEvent();
            WSAResetEvent(EventArray[1]);
            WSAEventSelect(sock1, EventArray[1], FD_ACCEPT);
         
            DWORD index = ::WaitForMultipleObjects(2, EventArray, TRUE, WSA_INFINITE);
            WSAEnumNetworkEvents(sock, EventArray[index - WSA_WAIT_EVENT_0], &NetworkEvents);
            if (NetworkEvents.lNetworkEvents &  FD_ACCEPT)
            {
                AcceptSocket = accept(sock, (SOCKADDR*)&destSockAddr, &iClientSize);
                closesocket(sock);
                sock = AcceptSocket;
                AcceptSocket = accept(sock1, (SOCKADDR*)&destSockAddr, &iClientSize);
                closesocket(sock1);
                sock1 = AcceptSocket;
            }
            
            int num1, num2;
            num2 = 1;
            cout << " Test Server => Num1" << endl;
            cin >> num1;
         
            for (int i = 0; i < WSA_MAXIMUM_WAIT_EVENTS; i++)
            if (EventArray[i] != NULL)
                WSACloseEvent(EventArray[i]);
            closesocket(sock);
            closesocket(sock1);
         
            return 0;
        }


      Когда я, при запущенном сервере, соединяюсь через telnet:
      telnet 127.0.0.1 58001
      telnet 127.0.0.1 58002
      сервер подучает FD_ACCEPT и работает корректно.
      Когда я, при запущенном сервере, соединяюсь через своего клиента сервер не получает FD_ACCEPT,
      а клиент получает FD_CONNECT с ошибкой 10061
        Это написано в коде клиента:

        Цитата rsergeya @

        addr.sin_port = htons(5801);
        ////////////////////////
        addr1.sin_port = htons(5802);


        Цитата rsergeya @
        Когда я, при запущенном сервере, соединяюсь через telnet:
        telnet 127.0.0.1 58001
        telnet 127.0.0.1 58002

        Не на те порты коннектитесь... :)
        На этих портах нет приложений - конннектиться не к чему.

        Ну а уж про клиентский код...модель сетевого ввода/вывода WSAEventSelect предназначена для серверных приложений...применять ее на таком простом клиенте - нонсенс.
        А уж SO_REUSEADDR на клиенте вообще мрак...
        Ну и совсем непонятна задача с двумя слушающими портами на стороне сервера.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0519 ]   [ 16 queries used ]   [ Generated: 2.05.24, 12:57 GMT ]