Код (Text): SendBytes dd ? wsa_buf WSABUF <?> MyAdresLocalIP db "192.168.0.1",0 lea eax, MyAdresLocalIP mov wsa_buf.buf, eax invoke lstrlen, addr MyAdresLocalIP mov wsa_buf.len, eax invoke WSASend, Socket, addr wsa_buf, 1, addr SendBytes, 0, NULL, NULL .if eax == SOCKET_ERROR .. Получаю WSAEFAULT The lpBuffers, lpNumberOfBytesSent, lpOverlapped, or lpCompletionRoutine argument is not totally contained in a valid part of the user address space. В чем моя ашыпка? Непойму...
leeloo Посмотри под дебаггером свою прогу, скорей всего после send'a ошибка должна быть "WSAENOTCONN", надо через connect ципаться к тому кому отправляешь!
fourty_fourty Пятый параметр WSASend, насколько я понял - не опциональный. Мельком глянул в мсдн, там этот параметр может принимать следующие значения: MSG_DONTROUTE; MSG_OOB; MSG_PARTIAL, и ни одно из них не является нулем. ЗЫ. WSASend не пользовал, могу ошибаться.
leeloo, фасмовый вариант твоего кода очень даже работает. Безо всяких WSAEFAULT. Сурс надо? Aspire, нет, флаги опциональные, ноль тоже сойдёт.
iZzz32, nester7, Aspire. Ок , победил я этого зверя. Переменная wsa_buf должна быть локальной. Спасибо всем, тема закрыта. Клиент-сервер в одном флаконе готов.
Что то вы неправильно там пофиксили у себя. Переменная wsa_buf олжна быть правильно инициализирована, а где она находится: на стеке или в секции данных - неважно. Ошибка WSAEFAULT говорит о том, что в драйвер был передан неправильный указатель на буфер с данными.
TarasCo А по исходнику не видно, как я передаю указатель? МСДН WSAEFAULT - The lpBuffers, lpNumberOfBytesSent, lpOverlapped, lpCompletionRoutine parameter is not totally contained in a valid part of the user address space. Т.е. как я понял переменная должна находится в адресном пространстве функции (т.е. локальная).(?????) Проверено дебагером .... Глобально - ошибка, локально - работает.
Comer_ Это не бред, это предположение. Ведь addr - это обращение только к переменным внутри ф-ции. leeloo пишет addr wsa_buf и если эта переменная локальна, то код работает. Вот я и предположил, что можно оставить переменную глобальной и поmенять в коде addr на offset.
leeloo это не одно и тоже и второе вообще первый раз слышу. локальная так и называется - локальная. не делай таких быстрых заключений дай код посмотреть? и покажи в нём что зафиксил
leeloo в принципи, вообще-то, переменная может находиться в адресном пространстве функции, но это явно не твой случай. просто пихается она в код и делаеться обводящий джамп, и если она не RO, то и аттрибуты памяти подправить надо - или в PE заголовке или через VirtualProtect(....) дай код посмотреть? и покажи в нём что зафиксил
По "исходнику" видно, что SendBytes и wsa_buf объявлены в секции кода, а значит read_only, отсюда и ошибка