Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Проблема с сокетами в Freepascal!

Страницы: 1
Проблема с сокетами в Freepascal!
Привет всем! Учусь работать с сокетами в Freepascal. Есть у меня такая программка:

Код
   lSock := Socket(af_inet, sock_stream, 0);
   if lSock = -1 then SockError('Socket: ');

   with sAddr do
   begin
     Family := af_inet;
     Port := htons(ListenPort);
     Addr := 0;
   end;

   Writeln('Listening on port ',ListenPort);
   if not Bind(lSock, sAddr, sizeof(sAddr)) then SockError('Bind: ');

ListenPort - word со значением 7878

Раньше она работала прекрасно (компилировал на fpc под Slackware Linux), но после переустановки системы почему-то работать вообще перестала!

Когда компилирую с ключем -Sd выдает мне:
Код
An unhandled exception occurred at 0x08062E1D :
Access violation
   0x08062E1D
   0x0805E481
   0x08064ECF
   0x080480B0


а с ключем -S2 вообще это:
Код
Bind: Permission denied


Что интересно, когда запускаю под рутом, -S2 версия компилируется и запускается без ошибок, но отвечает почему-то не на порту 7878, а на 198 o_O (определил это просканировов нмапом и посмотрев новые порты). Что это за ерунда такая??

htons() взят из inetaux.pas
Код
function htons(i : Integer) : Integer;
begin
    htons := lo(i) shl 8 or hi(i);
end;
Здравствуйте. Судя по всему, ошибка у Вас как раз в htons(). Из-за различных размеров типа Integer в разных режимах компилятора, htons() возвращает неправильное значение.

Объясню. В обоих случаях (и -Sd и S2) размер Integer - 32 бита, а функции lo() и hi() у Вас возвращают *word* (не byte), из переданного Integer.
Например, при lo(7878) = 7878 и hi(7878) = 0 htons вернет 2016768, что в общем-то неправильно =)

Кстати, компиляция с -St или вообще без параметра Вашу проблему решают.

Однако, я понятия не имею, почему код компилируется и работает в одном режиме, а в другом нет. Попробуйте использовать -ghl для получения большей информации о месте ошибки.

Вообще, я Вам рекомендую в Вашем коде использовать исключительно типы Integer, которые автоматически маппятся в типы с такими же значениями диапазонов, не зависимо от режима компилятора. Это действительно поможет Вам избежат подобных проблем в дальнейшем...

Вот код для htons():
Код
function htons(i : Word) : Word;
begin
    htons := lo(i) shl 8 or hi(i);
end;


Потому что тип "Word" всегда имеет размер 16 bit unsigned в любых режимах FPC и всех поддерживаемых им платформах ^_^
Так вот оно что... Действительно, замена Integer-ов Word-ами проблему решила smile:) Я постараюсь быть внимательнее к этому в будущем. Огромное спасибо за помощь!!!
Вот только непонятно почему же раньше это у меня компилировалось и работало, ахах smile:D

И еще интересно, что же это все-таки за чудеса с портом были??
Цитата
И еще интересно, что же это все-таки за чудеса с портом были??

Ну, это всё по той же причине) Обычно по-умолчанию пользовательским программам не разрешают открывать порты выше 1024 (и это объясняет почему не было "permission denied", когда Вы компилировали под root`ом), а bind() открывал порт 198 потому что старший байт, передаваемого в bind() Word`а 2016768 это как раз 198 (низший байт ноль).
Ооо, как все просто оказывается smile:) Вообще я только начал изучать сокеты и если бы не ваша помощь еще бы долго наверно голову ломал над этим всем, еще раз спасибо!
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)