Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2015, 09:40   #1
Ponot
 
Регистрация: 12.03.2015
Сообщений: 3
По умолчанию Влияник htons на socket

Согласно WinAPI перед функцией htons не обязательно выполнять WSAStartup. Тут согласен - все в порядке.

Сначала я столкнулся с тем что bind выдавал ошибку, пока я не вызвал htons. Я не использовал результат htons. Просто тупо вызов и все - после этого bind волшебным образом работает.
Попытка разобраться с ситуацией привела к еще более интересным результатам.
Так вызов htons перед WSAStartup - вызывает сбой WSAStartup (на XP) и Socket (Win7). Например:

Код:
	invoke	htons, ax
	invoke	WSAStartup, 202h, offset wsaData ;на XP уже здесь ошибка 10107 - Invalid system call.
	invoke	socket, PF_INET, SOCK_DGRAM, IPPROTO_UDP ;на Win7 Socket выдает WSAEINVAL - 10022 (Invalid argumet).
Просто убрав htons - все начинает работать.
Кто - нибудь может объяснить, что происходит?

Последний раз редактировалось Stilet; 17.03.2015 в 09:57.
Ponot вне форума Ответить с цитированием
Старый 17.03.2015, 13:40   #2
Ponot
 
Регистрация: 12.03.2015
Сообщений: 3
По умолчанию

Разобрался:
Код:
invoke	htons, ax
помещает в стек dword 0 затем AX итого 6 байт, по выходу из функции в стеке остается 2 байта. Казалось бы ну и ладно, но... Вероятно где-то в недрах Windows требуется строгое выравнивание стека на dword.
Теперь хоть invoke не используй. Ручками надо все писать.
Всем спасибо, вопрос закрыт.
Ponot вне форума Ответить с цитированием
Старый 17.03.2015, 14:34   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
помещает в стек dword 0 затем AX итого 6 байт
Чушь. Какой тип у параметра, что он занимает 6 байт?

Цитата:
по выходу из функции в стеке остается 2 байта. Казалось бы ну и ладно, но
Угу, почитайте как происходит вызов функции. Соглашения о параметрах, счетчик команд, адрес возврата, ... и прочие умные слова.

Цитата:
Вероятно где-то в недрах Windows требуется строгое выравнивание стека на dword.
Ну выравнивание там есть, но совсем не для того, о чем вы думаете.

Цитата:
Теперь хоть invoke не используй. Ручками надо все писать.
инвок мало чем отличается от ручек...
p51x вне форума Ответить с цитированием
Старый 18.03.2015, 09:01   #4
Ponot
 
Регистрация: 12.03.2015
Сообщений: 3
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Чушь. Какой тип у параметра, что он занимает 6 байт?
port - слово (dw)
делаю invoke htons, port
в дебагере
Код:
6A 00       push 0
68 581B0000 push 581bh
по выходу из htons в стеке лишние 2 байта.

Цитата:
Сообщение от p51x Посмотреть сообщение
Угу, почитайте как происходит вызов функции. Соглашения о параметрах, счетчик команд, адрес возврата, ... и прочие умные слова.
Спасибо, я кое-что об этом знаю, возможно недостаточно. Не понял к чему это "Угу", расшифровать можете?

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну выравнивание там есть, но совсем не для того, о чем вы думаете.
Я не знал, что выравнивание на границу двойного слова имеет такое большое значение. Простой push ax (или любое смещение стека на 2 байта) в начале любой программы - делает её практически неработоспособной. (Сбоит WinAPI)

Цитата:
Сообщение от p51x Посмотреть сообщение
инвок мало чем отличается от ручек...
мало, но такой ошибки я бы не допустил.
Ponot вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
htons - не берёт порт из структуры frommars C/C++ Сетевое программирование 2 05.03.2013 14:03
Socket IGOMERL C++ Builder 1 16.03.2011 11:05
Socket'ы Mu$T@nG Помощь студентам 4 19.07.2010 20:58
Socket Djem1991 Работа с сетью в Delphi 6 03.07.2009 23:45
socket Артэс C/C++ Сетевое программирование 2 22.06.2009 17:22