Асинхронный сокет сервер. Что не так.

Тема в разделе "WASM.NETWORKS", создана пользователем serega28, 21 окт 2010.

  1. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Клиент не соединяется.

    Часть кода сервера:

    Код (Text):
    1. if (::WSAStartup(MAKEWORD(2, 2), &wsData) == 0)
    2. {
    3.    socketServerListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    4.  
    5.    if (socketServerListen != SOCKET_ERROR)
    6.    {
    7.  
    8.     ulMode = 1;
    9.     iResult = ::ioctlsocket(socketServerListen, FIONBIO, (unsigned long*)&ulMode);
    10.                    
    11.     if (iResult != SOCKET_ERROR)
    12.     {
    13.               serviceAddr.sin_family = AF_INET;
    14.        serviceAddr.sin_addr.s_addr = ::inet_addr("127.0.0.1");
    15.               serviceAddr.sin_port = ::htons(6148);
    16.  
    17.               iResult = ::bind(socketServerListen, (struct sockaddr *)&serviceAddr, sizeof(serviceAddr));
    18.  
    19.        if (iResult != SOCKET_ERROR)
    20.        {
    21.                    FD_ZERO(&ReadSet);
    22.                    FD_SET(socketServerListen, &ReadSet);
    23.                  
    24.                   if ((ReadySock = ::select(0, &ReadSet, NULL, NULL, NULL)) != SOCKET_ERROR)
    25.                  {
    26.                      if (FD_ISSET(socketServerListen, &ReadSet))
    27.                     {
    28.                        int iSize = sizeof(clientAddr);
    29.                        clientListen = ::accept(socketServerListen, (struct sockaddr *)&clientAddr, &iSize);
    30.                        
    31.                        ...........................
    32.                     }
    33.                 }
    34.             }
    35.    }
    36.  }
    Кусок клиента:


    Код (Text):
    1. int iErr = WSAStartup(MAKEWORD(2,2), &wsaData);
    2.  
    3. if (iErr == 0)
    4. {
    5.        ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    6.  
    7.        saServer.sin_family = AF_INET;
    8.        saServer.sin_addr.s_addr = inet_addr("127.0.0.1");
    9.        saServer.sin_port = htons(6148);
    10.  
    11.        iErr = connect(ListenSocket, (sockaddr*)&saServer, sizeof(saServer));
    12.  
    13.        if (iErr == 0)
    14.        {
    15.            ............................
    16.        }
    17.  
    18.         WSACleanup();
    19. }
     
  2. Mentor

    Mentor New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2010
    Сообщения:
    67
    после bind() listen() не пробовали вызывать?
     
  3. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    добавил, не помогло.
     
  4. Mentor

    Mentor New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2010
    Сообщения:
    67
    сразу после ::bind впихните
    Код (Text):
    1. listen(socketServerListen, SOMAXCONN);
    и будет вам счастье.

    и ioctlsocket уберите, не нужен он там
     
  5. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Через ioctlsocket устанавливается асинхронный режим работы. Как это не нужен.
     
  6. xh4ck

    xh4ck New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2005
    Сообщения:
    60
    Адрес:
    Russia
    не нужен
     
  7. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Всё равно не работает
     
  8. Mentor

    Mentor New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2010
    Сообщения:
    67
    Значит не судьба.
    Или давайте полный код который не работает, или таки вставьте listen в тот кусок который вы привели - с listen там все ок
     
  9. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Это весь код. И он тут рабочий :)
    А у меня было
    Код (Text):
    1. socketServerListen = ::socket(AF_INET, SOCK_STREAM, 0);
    а в клиенте нормально стоит
    Код (Text):
    1. ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);