[Решено] Проблема: StrToNetAddr('192.168.0.х') out of range

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

[Решено] Проблема: StrToNetAddr('192.168.0.х') out of range

Сообщение yeger » 30.01.2015 15:07:32

Добрый день.

Столкнулся со странной проблемой, StrToNetAddr('192.168.0.128') приводит к ошибке 201 out of range. Юнит Sockets.
С чем может быть связано? Как избежать? Как получить sockaddr_in запись какими-то другими методами?

Менее 128 - все нормально.
Код отладочный, крайне избыточен, не ругайтесь...
Код: Выделить всё
procedure TSkanNetThread.Execute;
var
  Selfsocket: Integer;
  saddr:TInetSockAddr;
  WhatReturn: Integer;
  FTimeOut: Integer;
begin
  while (not Terminated) and (not FHostObj.FFindSuccess) do begin
    FHostObj.FFindInProgress := true;
    selfsocket := fpSocket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if selfsocket = -1 then
     begin
       //вырубать все
     end else begin
      FHostObj.FLFAddres := FHostObj.FLFMask + u_IntToStr(NumIp);
      saddr.sin_family := AF_INET;
      saddr.sin_port := htons(Word(FHostObj.FLFPort));

      saddr.sin_addr.s_addr := Integer(StrToNetAddr(FHostObj.FLFAddres));//вот тут ошибка!!

      WhatReturn := fpbind(selfSocket,@saddr,SizeOf(TSockAddr));
      fpShutDown(selfSocket,2);
      if WhatReturn <> 0 then
       begin
         NumIp := NumIP + 1;
         if NumIp > 255 then begin
           FHostObj.FFindSuccess := false;
           FHostObj.SkanEnds(FHostObj.FLFAddres);
           NumIp := 0;
         end;


----------------------------------
Win7x64, lazarus 1.2.6 win32
Последний раз редактировалось yeger 30.01.2015 17:36:14, всего редактировалось 1 раз.
Аватара пользователя
yeger
новенький
 
Сообщения: 49
Зарегистрирован: 17.03.2011 12:26:34

Re: Проблема: StrToNetAddr('192.168.0.х') out of range

Сообщение SSerge » 30.01.2015 16:46:43

Функция StrToNetAddr возвращает вот это:

Код: Выделить всё
type in_addr = packed record
  case Boolean of
    True: (
        s_addr: cuint32;  // Actual address
      );
    False: (
        s_bytes: array [1..4] of Byte; // Address as bytes
      );
end;


Вы не задумывались над тем, что структуру нельзя кастить в Integer?

Добавлено спустя 3 минуты 1 секунду:
если так будет понятнее, преобразование unsigned int32 в int32 при определенных обстоятельствах приводит либо к потере данных, либо к переполнению (Out of range)
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: [Решено] Проблема: StrToNetAddr('192.168.0.х') out of ra

Сообщение yeger » 30.01.2015 17:36:53

Да, понял, спасибо.
Аватара пользователя
yeger
новенький
 
Сообщения: 49
Зарегистрирован: 17.03.2011 12:26:34


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 230

Рейтинг@Mail.ru
cron