На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > CSocket::Connect - ошибка 10038 , как лечить?
      писал клиент-сервер. дома на тестовой машине пахало на ура.
      была сеть из двух машин с IP 192.168.0.1 и 192.168.0.2
      принес проект на работу и вот такая хрень. 10038 ошибка. кек лечить не пойму.
      а на работе все машины с внешними IP.
      клиент:
      ExpandedWrap disabled
         char ip_address[256];
         sprintf(ip_address, "%d.%d.%d.%d", adr[0], adr[1], adr[2], adr[3]);
            
         int port = 2106;
         BOOL res = pConnect->Connect(ip_address, port);


      server:
      ExpandedWrap disabled
        for(;;)
         {
           fd_set readset;
           FD_ZERO( &readset );
           FD_SET( login_socket, &readset );
           FD_SET( game_socket, &readset );
         
           for( int it = 0; it < clients.GetSize(); it++)
            FD_SET( clients.GetAt(it)->GetSocket(), &readset );
         
           timeval timeout;
           timeout.tv_sec = 0;
           timeout.tv_usec = 1;
              
           int mx = getmax( max( login_socket, game_socket ) );
          
           if( FD_ISSET( login_socket, &readset ) )
           {
             //this is new connect
              // sockaddr_in login_name;
             int client_sock = accept( login_socket, 0, 0 );
             if( client_sock < 0 )
             {
                printfex(RED, "error: accept() \n");
                exit();
                closesocket( login_socket );
                closesocket( game_socket );
                return 1;
             }
         
        //     fcntl( client_sock, F_SETFL, O_NONBLOCK );
         
             CClient* pClient = new CClient;
             pClient->SetSocket( client_sock );
             pClient->port = 2106;
             clients.add( pClient );
            
             if( -1 == m_Login->OnConnect(pClient) )
             {
               printfex(RED, "[L2 Serever] fatal connect to 2106\n");
               remove( pClient );
             }
             else printfex(YELLOW, "[L2 Serever] connect to 2106\n");
           }  
         }


      Добавлено
      ЗЫ, пытался отрубить тачку от сети и поставить на ней "домашние" IP - один хрен не пашет.

      Добавлено
      млин,
      ExpandedWrap disabled
         WSADATA WSAData ;
         if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0)
         {
                //      ::MessageBox (NULL, TEXT("WSAStartup failed!"), TEXT("Error"), MB_OK);
                return;
         }
         
        char ip_address[256];
         sprintf(ip_address, "%d.%d.%d.%d", adr[0], adr[1], adr[2], adr[3]);
            
         int port = 2106;
         BOOL res = pConnect->Connect(ip_address, port);


      однако
      ExpandedWrap disabled
        WSADATA WSAData ;
         if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0)
         {
                //      ::MessageBox (NULL, TEXT("WSAStartup failed!"), TEXT("Error"), MB_OK);
                return;
         }


      вызывалось при старте программы. чудеса однако.
      Сообщение отредактировано: progman -
        progman
        Так а где - после какой функции - эта ошибка вылазит???
        WSAENOTSOCK (10038) Socket operation on non-socket.
        Berkeley description: An operation was attempted on something that is not a socket. The specified socket parameter refers to a file, not a socket.
        WinSock description: Same as Berkeley. The socket input parameter is not a valid socket handle (either it never was valid, it's a file handle (not a socket handle), or if it was a socket handle, it has been closed).
        Detailed description:
        select(): fails with WSAENOTSOCK if any socket in an fd_set is an invalid socket handle.
        Developer suggestions: Did you close a socket inadvertently in one part of an application without keeping another part notified? Use socket state in an application and/or handle this error gracefully as a non-fatal error.
        WinSock functions: Any function that takes a socket as an input parameter: accept(), bind(), closesocket(), connect(), getpeername(), getsockname(), getsockopt(), ioctl socket(), listen(), recv(), recvfrom(), select(), send(), sendto(), setsockopt(), shutdown(), FD_CONNECT
        Additional functions: WSAAsyncSelect() should be in the list of functions (some applications might not register for or handle the FD_CONNECT message).
          Oleg2004
          вылезала сразу после
          BOOL res = pConnect->Connect(ip_address, port);

          клиентский сокет не мог законнекится на серверный.
          в инициализации окна стоял WSAStartup , очевидно не хватило одного вызова :huh: .

          поставил WSAStartup перед коннектом и заработало.
            progman
            Цитата
            поставил WSAStartup перед коннектом и заработало.

            Это виндовский закон - в любой сетевой программе надо инициализировать Winsock и затем в конце освободить все сетевые ресурсы - WSAСleanup
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0222 ]   [ 16 queries used ]   [ Generated: 11.12.24, 13:36 GMT ]