Уважаемые форумчане! Не могу самостоятельно разобраться с ошибкой WSAENOTSOCK "The descriptor is not a socket", которая возникает при подключении connect, причем сокет создается без ошибки, а ошибка вылезает во время подключения (смотрю в отладчике OllyDebug 2.00k)? Просмотрел все 10 раз, в упор не вижу, где я накосячил. Код (Text): .386 .model flat, stdcall option casemap :none include windows.inc include kernel32.inc include wsock32.inc includelib kernel32.lib includelib wsock32.lib .data szHostname db "www.ya.ru",0 http_request db "GET / HTTP/1.1",13,10,\ "Host: www.nntt.org",13,10,\ "User-Agent: socket-c",13,10,13,10,0 .code socket_c proc LOCAL wsa:WSADATA LOCAL ip:DWORD LOCAL sock:DWORD LOCAL sadr:sockaddr_in invoke WSAStartup,202h,addr wsa test eax,eax jnz exitproc invoke gethostbyname,addr szHostname test eax,eax jz cleanup assume eax:ptr hostent mov eax,[eax].h_list mov eax,dword ptr [eax] mov eax,dword ptr [eax] mov ip,eax invoke socket,AF_INET,SOCK_STREAM,0 test eax,SOCKET_ERROR jz cleanup mov sadr.sin_family,AF_INET invoke htons,80 mov sadr.sin_port,80 mov eax,ip mov sadr.sin_addr,eax invoke RtlZeroMemory,addr sadr.sin_zero,8 invoke connect,sock,addr sadr,sizeof sadr test eax,eax jnz cleansock invoke send,sock,addr http_request,sizeof http_request,0 test eax,SOCKET_ERROR jz cleansock cleansock: invoke closesocket,sock cleanup: invoke WSACleanup exitproc: ret socket_c endp start: invoke socket_c invoke ExitProcess,0 end start Код выкладываю целиком и как есть - дальше send ничего еще не написано. Цель, как несложно понять, соединиться с web-сервером и получить содержание главной страницы сайта. Осваиваю сокеты, переписывая пример с VB6 на ASM.
Нашел свою ошибку, самую тупую, какие только бывают. Забыл сохранить дескриптор сокета в переменную, которую затем использовал при подключении. В упор не видел эту ошибку до тех пор, пока не увидел в отладчике, что для connect в стек вместо нормального дескриптора сокета передавался всякий мусор из стека. Чтобы исправить, дописал одну строку: mov sock,eax после проверки на ошибку функции socket. Правда осталась ошибка WSAETIMEDOUT при работе в отладчике, но это похоже как раз задержка работы отладчика, в нормальном режиме этого быть не должно. Всем спасибо за внимание!
Код (Text): .............. invoke socket,AF_INET,SOCK_STREAM,0 test eax,SOCKET_ERROR jz cleanup mov sock, eax ; <<<<<<<<<<<<<<<< mov sadr.sin_family,AF_INET ..................
Да, все верно. Есть еще пара несуразностей в моем исходнике: указано разное имя хоста для тестирования программы, надо обращаться к одному хосту по имени, вот так: Код (Text): .data szHostname db "www.ya.ru",0 http_request db "GET / HTTP/1.1",13,10,\ "Host: www.ya.org",13,10,\ ;<<<<<<<<<<<<< "User-Agent: socket-c",13,10,13,10,0 И ещё одна ерунда, появившаяся во время моей "отладки". Порт в connect передаем в сетевом порядке байт, т.е. как результат htons в ax: Код (Text): mov sadr.sin_family,AF_INET invoke htons,80 mov sadr.sin_port,ax ;<<<<<<<<<<<<<<<<<<<< mov eax,ip mov sadr.sin_addr,eax invoke RtlZeroMemory,addr sadr.sin_zero,8 invoke connect,sock,addr sadr,sizeof sadr test eax,eax jnz cleansock Если доведу пример http-downloader'а до ума, выложу готовый исходник.