проблема с возвратом в блокирующий режим

Тема в разделе "WASM.NETWORKS", создана пользователем Sickle, 27 июл 2005.

  1. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    Вечер добрый. у меня есть слушающий асинхронный сокет:


    Код (Text):
    1.  
    2. invoke socket,AF_INET,SOCK_STREAM,IPPROTO_IP
    3. mov    hConListSock, eax
    4. invoke WSAAsyncSelect, hConListSock, hWnd, WM_CONSOCK, FD_ACCEPT or FD_READ
    5.  




    далее, при подключении к нему, сокет, возвращенный ф-цией accept нужно перевести в блокирующий режим. я делаю так:


    Код (Text):
    1.  
    2. invoke accept, hConListSock, 0, 0
    3. mov    hSock, eax
    4. invoke WSAAsyncSelect, eax, hWnd, WM_CONSOCK, 0
    5. invoke ioctlsocket, hSock, FIONBIO, 0
    6.  




    ioctlsocket возвращает ошибку. в чем проблема?
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    делай так:
    Код (Text):
    1. invoke accept, hConListSock, 0, 0
    2. mov    hSock, eax
    3. invoke WSAAsyncSelect, eax, 0, 0, 0
    4. invoke ioctlsocket, hSock, FIONBIO, 0
    5.  




    И вообще лучше не использовать WSAAsyncSelect, так как эта модель ввода-вывода сделана через ж..у и работает очень тормознуто. Используй WSAEventSelect или IoCompletionPorts
     
  3. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    спасибо, попробую
     
  4. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    попробовал... в таком виде ошибка возвращается уже после WSAAsyncSelect :dntknw:
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    переходи на WSAEventSelect, с ним таких проблем точно не будет
     
  6. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    те же яйца, только в профиль :dntknw:

    создаю:
    Код (Text):
    1.  
    2. invoke socket,AF_INET,SOCK_STREAM,IPPROTO_IP
    3. mov    hConListSock, eax
    4. invoke WSACreateEvent
    5. mov    dwEvents, eax
    6. invoke WSAEventSelect, hConListSock, dwEvents, FD_ACCEPT or FD_READ
    7.  


    пытаюсь перевести в блокирующий:
    Код (Text):
    1.  
    2. invoke accept, hConListSock, 0, 0
    3. mov    hSock, eax
    4. invoke WSAEventSelect, eax, 0, 0
    5. invoke ioctlsocket, hSock, FIONBIO, 0
    6.  


    и опять ошибка после ioctlsocket

    "то я не так делаю?" (С)
     
  7. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Вот кусок кода на паскале, который 100% работает.


    Код (Text):
    1. procedure BlockSocket(Socket: integer);
    2. var
    3.  Mode: dword;
    4. begin
    5.  WSAEventSelect(Socket, 0, 0);
    6.  Mode := 0;
    7.  ioctlsocket(Socket, FIONBIO, Mode);
    8. end;
    9.  
    10. procedure UnblockSocket(Socket: integer; Event: dword);
    11. begin
    12.  WSAEventSelect(Socket, Event, FD_CLOSE);
    13. end;




    Мне кажется, проблема в том, что ioctlsocket нужно передавать указатель на переменную в которой храниться нужный режим, а ты передаешь просто 0.
     
  8. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    Я осел!
    Код (Text):
    1.  
    2. invoke ioctlsocket, hSock, FIONBIO, 0
    3.  


    не есть хорошо. ибо хорошо есть
    Код (Text):
    1.  
    2. mov    dwZero,0
    3. invoke ioctlsocket, hSock, FIONBIO, addr dwZero
    4.  


    всем спасибо!

    MS Rem, спасибо! мы с тобой одновременно свои сообщения послали... я только что додул до этой ошибки... действительно, в этом дело и было...