Проблемы с recv

Тема в разделе "WASM.NETWORKS", создана пользователем XSInet, 4 май 2006.

  1. XSInet

    XSInet New Member

    Публикаций:
    0
    Регистрация:
    4 май 2006
    Сообщения:
    5
    Не работет следующий код:



    .if lParam == FD_ACCEPT



    invoke accept, Accepting_Socket, NULL, NULL

    mov Client_Socket, eax

    invoke MessageBoxA, 0, addr S9, NULL, 0



    invoke recv, Client_Socket, addr Password, 10, 0



    invoke MessageBoxA, 0, addr Password, NULL, 0



    .endif



    Прога на recv не останавливается, она её как "пролистывает" recv. Client_Socket - блокирующий сокет.

    invoke MessageBoxA, 0, addr Password, NULL, 0 - выдаётся пустой MessageBox сразу после подключения. В чём проблема ?
     
  2. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    попробуй так:
    Код (Text):
    1.      ...
    2.      ...
    3. wmsocket:
    4.      mov eax, lParam
    5.      and eax, 0FFFFh
    6.      cmp eax, FD_ACCEPT
    7.      je fd_accept
    8.      cmp eax, FD_READ
    9.      je fd_read
    10.      ...
    11.      ...
    12. fd_accept:
    13.      invoke accept, wParam, 0, 0
    14.      cmp eax, -1
    15.      je accept_error
    16.      invoke WSAAsyncSelect, eax, hWnd, WM_SOCKET, FD_READ + FD_CLOSE
    17.      ...
    18.      ...
    19. fd_read:
    20.      invoke recv, wWaram, addr Password, 10, 0
    21.      invoke MessageBox, 0, addr Password, NULL, 0
    22.      ...
    23.      ...




    Хотя холжен работать и твой вариант, значит ошибка в другом месте (скорее всего сокет не валидный!)
     
  3. XSInet

    XSInet New Member

    Публикаций:
    0
    Регистрация:
    4 май 2006
    Сообщения:
    5
    А можно всё таки в "процедуре" FD_ACCEPT это сделать. Это как бы пасс сразу после подключения проверяется.
     
  4. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    так у тебя так и будет! после accept, WSAAsyncSelect затачивает сокет на определение события FD_READ, и как только сокет готов для чтения - оно происходит...

    В товем примере, скорее всего ошибка, нужет полный код для анализа...
     
  5. XSInet

    XSInet New Member

    Публикаций:
    0
    Регистрация:
    4 май 2006
    Сообщения:
    5
    Спасибо,

    тогда другой вопрос : есть буфер на 10 байт. В него идёт приём данных, так вот если послать >10 байт, то fd_read вызовется несколько раз (в зависимости от размера присланных данных), как этого избежать ?
     
  6. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    не вдаваясь в подробности - после приема 10 байт - элементарно заблокировать прием функцией shutdown и закрыть сокет... за подробностями в MSDN - или к статьям с этого сайта :)
     
  7. hamper

    hamper Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    37
    Адрес:
    Russia
    Чтобы избежать появления лишних сообщений нужно перед началом чтения вызвать для сокета WSAAsyncSelect без FD_READ, а перед последним вызовом recv - вызвать с FD_READ. (Вроде WSAAsyncSelect переводит сокет в неблокирующий режим, и если надо, переводим в блокирущий вручную).