Не работет следующий код: .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 сразу после подключения. В чём проблема ?
попробуй так: Код (Text): ... ... wmsocket: mov eax, lParam and eax, 0FFFFh cmp eax, FD_ACCEPT je fd_accept cmp eax, FD_READ je fd_read ... ... fd_accept: invoke accept, wParam, 0, 0 cmp eax, -1 je accept_error invoke WSAAsyncSelect, eax, hWnd, WM_SOCKET, FD_READ + FD_CLOSE ... ... fd_read: invoke recv, wWaram, addr Password, 10, 0 invoke MessageBox, 0, addr Password, NULL, 0 ... ... Хотя холжен работать и твой вариант, значит ошибка в другом месте (скорее всего сокет не валидный!)
А можно всё таки в "процедуре" FD_ACCEPT это сделать. Это как бы пасс сразу после подключения проверяется.
так у тебя так и будет! после accept, WSAAsyncSelect затачивает сокет на определение события FD_READ, и как только сокет готов для чтения - оно происходит... В товем примере, скорее всего ошибка, нужет полный код для анализа...
Спасибо, тогда другой вопрос : есть буфер на 10 байт. В него идёт приём данных, так вот если послать >10 байт, то fd_read вызовется несколько раз (в зависимости от размера присланных данных), как этого избежать ?
не вдаваясь в подробности - после приема 10 байт - элементарно заблокировать прием функцией shutdown и закрыть сокет... за подробностями в MSDN - или к статьям с этого сайта
Чтобы избежать появления лишних сообщений нужно перед началом чтения вызвать для сокета WSAAsyncSelect без FD_READ, а перед последним вызовом recv - вызвать с FD_READ. (Вроде WSAAsyncSelect переводит сокет в неблокирующий режим, и если надо, переводим в блокирущий вручную).