connect -> errcode 10035

Тема в разделе "WASM.NETWORKS", создана пользователем ptech, 10 фев 2006.

  1. ptech

    ptech Петров Сергей

    Публикаций:
    0
    Регистрация:
    29 ноя 2005
    Сообщения:
    11
    Адрес:
    Russia
    Доброго времени суток!
    Код (Text):
    1.  
    2.  ...
    3.  local sin :sockaddr_in
    4.  ...
    5.  invoke socket, AF_INET, SOCK_STREAM, IPPROTO_IP
    6.  cmp eax, INVALID_SOCKET
    7.  je  Ex
    8.  mov client, eax
    9.  invoke WSAAsyncSelect, client, hWnd, WM_SOCKET, FD_CONNECT or FD_READ or FD_CLOSE
    10.  cmp eax, SOCKET_ERROR
    11.  je  Error
    12.  mov sin.sin_family, AF_INET
    13.  mov eax, port
    14.  xchg al, ah
    15.  mov sin.sin_port, ax
    16.  invoke inet_addr, ip_addres
    17.  mov sin.sin_addr, eax
    18.  invoke connect, client, addr sin, sizeof sin
    19.  cmp eax, SOCKET_ERROR
    20.  je  Error
    21.  jmp Ex
    22.    
    23. Error:
    24.  invoke WSAGetLastError
    25.  ...
    26.  Ex:
    27.  




    При попытке подключиться connect возвращает ошибку. WSAGetLastError возвращает 10035 - WSAEWOULDBLOCK. В справочнике написано, что это не фатальная ошибка, просто операция не может быть выполнена немедленно, но соединение устанавливается. При отправке данных от клиента сервер сервер нормально их обрабатывает, а при отправке данных от сервера процедура окна клиента не получает сообщение WM_SOCKET. Перерыл кучу примеров и ничего не нашел. В нете об этом либо молчат, либо предлагают использовать WSAEventSelect. Помогите, пожалуста, решить эту проблему с исползованием WSAAsyncSelect.
     
  2. Guest

    Guest Guest

    Публикаций:
    0
    WSAAsyncSelect переводит сокет в неблокирующий режим, ошибка WSAEWOULDBLOCK и должна появлятся.

    потому делай так
    Код (Text):
    1.  
    2. invoke WSAAsyncSelect, client, hWnd, WM_SOCKET, FD_CONNECT or FD_READ or FD_CLOSE
    3. invoke WSAGetLastError
    4. cmp eax, WSAEWOULDBLOCK
    5. jne  Error


    А вообще лучше не привязывать сокет к окну. Используй WSAEventSelect, такая схема будет работать во всех win32 приложениях



    P.S.
    Код (Text):
    1.  mov eax, port
    2.  xchg al, ah
    3.  mov sin.sin_port, ax
    4.  


    а почему htons не юзаешь?
     
  3. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    ptech

    FD_CONNECT - соединение установлено.

    FD_READ - сокет готов к чтению (есть данные в буфере)

    FD_CLOSE - сокет закрывается

    FD_WRITE - сокет готов к загрузке в буфер для отправки (в зависимости от размера буфера, он может переполнится)

    И каких событий ожидаем ? ;) События, типа идёт отправка, нет, а вот о событии - данные отправлены можно судить по FD_WRITE
     
  4. ptech

    ptech Петров Сергей

    Публикаций:
    0
    Регистрация:
    29 ноя 2005
    Сообщения:
    11
    Адрес:
    Russia
    2Corleone

    >а почему htons не юзаешь?



    Результат один и тот же.



    P.S.:Если не сложно, кинь рабочий пример с использованием WSAEventSelect.



    2SteelRat

    >И каких событий ожидаем ?



    Именно тех, которые указаны. Хотя, FD_CONNECT мне не шибко нужен.
     
  5. Guest

    Guest Guest

    Публикаций:
    0


    Вот скидываю пример Джонса и Оланда из их книги (Си),

    А так же тот же пример, но на асме (ужасная разметка но понять можно при желании)

    http://wasm.ru/forum/index.php?action=vthread&forum=12&topic=8027

    [​IMG] 176633015__eventselect.cpp
     
  6. ptech

    ptech Петров Сергей

    Публикаций:
    0
    Регистрация:
    29 ноя 2005
    Сообщения:
    11
    Адрес:
    Russia
    2Corleone



    Спасибо! Буду разбираться.