получение ip адреса
От: Аноним  
Дата: 27.08.07 13:11
Оценка:
подскажите как на шарпе получить ip компьютера в виде ulong
спасибо
Re: получение ip адреса
От: Дюша Россия http://www.danfoss.com/russia
Дата: 27.08.07 14:17
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>подскажите как на шарпе получить ip компьютера в виде ulong

А>спасибо
//Convert dotted IP address into IP number in long
        public static double Dot2LongIP(string DottedIP)
        {
            int i, pos, PrevPos = 0, num = 0;
            double build = 0;
            if(DottedIP == "")
                return 0;
            for(i=0;i<4;i++)
            {
                pos = DottedIP.IndexOf(".", PrevPos + 1);
                if (i == 3)
                    pos = DottedIP.Length;
                num = int.Parse(DottedIP.Substring(PrevPos, pos - PrevPos));
                PrevPos = pos + 1;
                build = ((num % 256) * (Math.Pow(256, (3 - i)))) + build;
            }
            return build;
        }
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>

Re[2]: получение ip адреса
От: Аноним  
Дата: 27.08.07 14:32
Оценка:
Здравствуйте, Дюша, Вы писали:

это понятно, спасибо
а встроенного нету ?
Re[3]: получение ip адреса
От: Дюша Россия http://www.danfoss.com/russia
Дата: 27.08.07 14:42
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Дюша, Вы писали:


А>это понятно, спасибо

А>а встроенного нету ?

нет
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>

Re[2]: получение ip адреса
От: Mika Soukhov Stock#
Дата: 27.08.07 14:42
Оценка:
Здравствуйте, Дюша, Вы писали:

Д>
Д>//Convert dotted IP address into IP number in long
Д>                pos = DottedIP.IndexOf(".", PrevPos + 1);
Д>                if (i == 3)
Д>                    pos = DottedIP.Length;
Д>                num = int.Parse(DottedIP.Substring(PrevPos, pos - PrevPos));
Д>                PrevPos = pos + 1;
Д>                build = ((num % 256) * (Math.Pow(256, (3 - i)))) + build;
Д>


Буду краток — ужас.
Re[3]: получение ip адреса
От: Дюша Россия http://www.danfoss.com/russia
Дата: 27.08.07 14:47
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>Здравствуйте, Дюша, Вы писали:


Д>>
Д>>//Convert dotted IP address into IP number in long
Д>>                pos = DottedIP.IndexOf(".", PrevPos + 1);
Д>>                if (i == 3)
Д>>                    pos = DottedIP.Length;
Д>>                num = int.Parse(DottedIP.Substring(PrevPos, pos - PrevPos));
Д>>                PrevPos = pos + 1;
Д>>                build = ((num % 256) * (Math.Pow(256, (3 - i)))) + build;
Д>>


MS>Буду краток — ужас.


Колхоз — дело добровольное! Не нравится, перепеши. Это copy/paste из примера шедшего вместе с платной базой IP/Country.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>

Re[4]: получение ip адреса
От: _uncle  
Дата: 27.08.07 14:59
Оценка:
Здравствуйте, Дюша, Вы писали:

Д>Здравствуйте, Mika Soukhov, Вы писали:


MS>>Буду краток — ужас.


Д>Колхоз — дело добровольное! Не нравится, перепеши. Это copy/paste из примера шедшего вместе с платной базой IP/Country.


А они тоже наверно на форуме где нить спросили, студента взяли на работу
Re[4]: получение ip адреса
От: Mika Soukhov Stock#
Дата: 27.08.07 15:32
Оценка: :)
Здравствуйте, Дюша, Вы писали:

Д>Колхоз — дело добровольное! Не нравится, перепеши. Это copy/paste из примера шедшего вместе с платной базой IP/Country.


А вот мой копи-пасте:

byte[] byteIP = addr.GetAddressBytes();
return ((((byteIP[3] << 0x18) | (byteIP[2] << 0x10)) | (byteIP[1] << 8)) | byteIP[0]) & ((long)0xffffffff);
Даже наверное так
От: Блудов Павел Россия  
Дата: 29.08.07 02:51
Оценка: +3
Здравствуйте, Mika Soukhov, Вы писали:

MS>А вот мой копи-пасте:

MS>
MS>byte[] byteIP = addr.GetAddressBytes();
MS>return ((((byteIP[3] << 0x18) | (byteIP[2] << 0x10)) | (byteIP[1] << 8)) | byteIP[0]) & ((long)0xffffffff);
MS>


У меня так получилось:
    byte[] byteIP = addr.GetAddressBytes();

    if (byteIP.Length != 4)
        throw new NotSupportedException("IPv6 идёт лесом.");
    
    return BitConverter.ToInt32(byteIP, 0);
... << RSDN@Home 1.2.0 alpha rev. 726>>
Re: получение ip адреса
От: Аноним  
Дата: 29.08.07 10:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>подскажите как на шарпе получить ip компьютера в виде ulong

А>спасибо


        public static string IntToIPAddressString(int ipAddress)
        {
            long a = (ipAddress & 0xff000000) >> 24;
            long b = (ipAddress & 0x00ff0000) >> 16;
            long c = (ipAddress & 0x0000ff00) >> 8;
            long d = (ipAddress & 0x000000ff);
            return string.Format("{0}.{1}.{2}.{3}", a, b, c, d);
        }

        public static int IPAddressStringToInt(string ipAddress)
        {
            string[] s = ipAddress.Split(".".ToCharArray());
            return Convert.ToInt32(s[0]) * 256 * 256 * 256 +
                   Convert.ToInt32(s[1]) * 256 * 256 +
                   Convert.ToInt32(s[2]) * 256 +
                   Convert.ToInt32(s[3]);
        }
Re: тогда уж так
От: ksg71 Германия  
Дата: 29.08.07 10:44
Оценка: 18 (1) -2
Здравствуйте, Блудов Павел, Вы писали:

БП>Здравствуйте, Mika Soukhov, Вы писали:


MS>>А вот мой копи-пасте:

MS>>
MS>>byte[] byteIP = addr.GetAddressBytes();
MS>>return ((((byteIP[3] << 0x18) | (byteIP[2] << 0x10)) | (byteIP[1] << 8)) | byteIP[0]) & ((long)0xffffffff);
MS>>


БП>У меня так получилось:

БП>
БП>    byte[] byteIP = addr.GetAddressBytes();

БП>    if (byteIP.Length != 4)
БП>        throw new NotSupportedException("IPv6 идёт лесом.");
    
БП>    return BitConverter.ToInt32(byteIP, 0);
БП>





if (addr.AddressFamily == AddressFamily.InterNetworkV6)
    throw new NotSupportedException("IPv6 идет лесом");

return addr.GetHashCode();
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re[2]: тогда уж так
От: Mika Soukhov Stock#
Дата: 29.08.07 11:19
Оценка: +1
Здравствуйте, ksg71, Вы писали:

Сколько способов по-написали.

K>
K>if (addr.AddressFamily == AddressFamily.InterNetworkV6)
K>    throw new NotSupportedException("IPv6 идет лесом");

K>return addr.GetHashCode();
K>


Это высший уровень дзен-програмизма, когда вызывает obsolete свойство, и никакого варнинга.

Но использовать я бы такое не стал.
Re[3]: тогда уж так
От: ksg71 Германия  
Дата: 29.08.07 11:24
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>Здравствуйте, ksg71, Вы писали:


MS>Сколько способов по-написали.


K>>
K>>if (addr.AddressFamily == AddressFamily.InterNetworkV6)
K>>    throw new NotSupportedException("IPv6 идет лесом");

K>>return addr.GetHashCode();
K>>


MS>Это высший уровень дзен-програмизма, когда вызывает obsolete свойство, и никакого варнинга.


MS>Но использовать я бы такое не стал.


согласен, в промышленном продукте однозначно не стоит.
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Вот так как раз нельзя
От: Блудов Павел Россия  
Дата: 30.08.07 03:23
Оценка: 1 (1) +1
Здравствуйте, ksg71, Вы писали:

K>
K>if (addr.AddressFamily == AddressFamily.InterNetworkV6)
K>    throw new NotSupportedException("IPv6 идет лесом");
K>


Изначально задача стояла перевести IP адрес в int32. IPv6 идёт лесом, но на нём жизнь не заканчивается.
Будут ещё IPv8/2 размером также 4 байта и IPv27 размером в 29 байт.
Так что корректно именно взять размер массива и посмотреть, четыре там байта или не четыре.

Ещё куда ни шло проверять так
if (addr.AddressFamily != AddressFamily.InterNetworkV4)
    throw new NotSupportedException("Only IPv4 supported in this release");


Но, как я уже говорил, IPv8/2 тоже может быть преобразован в Int32 и кидать исключение нет надобности.

Лирическое отступление

Разработчики WindowsNT 4.0, написали regedit.exe, который читает заголовок .reg файла и если там написано не REGEDIT4, то пытаются читать его как reg-файл от WindowsNT 3.1.
Теперь представьте, как веселились те же разработчики, когда обнаружили, что в Windows2000 нужно опять поменять формат .reg-файлов, но regedit от WindowsNT 4.0, увидев REGEDIT5 и проверив эту строку на REGEDIT4 решает что это .reg-файл от Windows NT 3.1 и тупо стреляется.
Именно поэтому .reg-Файлы от Windows2000 имеют заголовок "Windows Registry Editor Version 5.00" а не REGEDIT5, как это было в первой бете Windows2000.

Вобщем думайте о завтрашнем дне и когда дело доходит до версий никогда не используйте операторы == и !=
... << RSDN@Home 1.2.0 alpha rev. 726>>
Re: Вот так как раз нельзя
От: _FRED_ Черногория
Дата: 30.08.07 04:32
Оценка: 1 (1) +1
Здравствуйте, Блудов Павел, Вы писали:

БП>Вобщем думайте о завтрашнем дне и когда дело доходит до версий никогда не используйте операторы == и !=


Я не был бы так категоричен… Ты сам сказал, что
БП>Ещё куда ни шло проверять так
БП>if (addr.AddressFamily != AddressFamily.InterNetworkV4)
БП>    throw new NotSupportedException("Only IPv4 supported in this release");

Просто часто удобно версии именовать "не-comparable" величинами, а именно "equatable", чо бы потом делать switch, например, вместо ветвлений со сравнениями. Смотря, чего надо добиться.

ЗЫ:
БП>Изначально задача стояла перевести IP адрес в int32.

изначально
Автор:
Дата: 27.08.07
разговор был

как на шарпе получить ip компьютера в виде ulong

Help will always be given at Hogwarts to those who ask for it.
Re: Вот так как раз нельзя
От: ksg71 Германия  
Дата: 30.08.07 07:47
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Здравствуйте, ksg71, Вы писали:


БП>Вобщем думайте о завтрашнем дне и когда дело доходит до версий никогда не используйте операторы == и !=


собственно своим кодом я хотел проиллюстрировать возможность использовать GetHashCode() для решения вопроса,
и он "завязан" на текущую реализацию данного метода в типе IPAddress


public override int GetHashCode()
{
    if (this.m_Family != AddressFamily.InterNetworkV6)
    {
        return (int) this.m_Address;
    }

    . . .
}


и моя реплика вовсе не о том как проверять версии, но раз уж речь зашла, то я поступил аналогично MS
и сделал правильно ибо решение использует именно сегодняшнее положение вещей

public long Address
{
    get
    {
        if (this.m_Family == AddressFamily.InterNetworkV6)
        {
            throw new SocketException(SocketError.OperationNotSupported);
        }
        return this.m_Address;
    }
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re: получение ip адреса
От: o-andrushka-o Россия http://o-andrushka-o.livejournal.com/
Дата: 01.09.07 12:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>подскажите как на шарпе получить ip компьютера в виде ulong

А>спасибо


System.Net.IPEndPoint endPoint = new System.Net.IPEndPoint(address, port);
long ip = endPoint.Address.Address;
It's good to be bad
Re: Даже наверное так
От: Аноним  
Дата: 11.09.07 12:59
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Здравствуйте, Mika Soukhov, Вы писали:


MS>>А вот мой копи-пасте:

MS>>
MS>>byte[] byteIP = addr.GetAddressBytes();
MS>>return ((((byteIP[3] << 0x18) | (byteIP[2] << 0x10)) | (byteIP[1] << 8)) | byteIP[0]) & ((long)0xffffffff);
MS>>


БП>У меня так получилось:

БП>
БП>    byte[] byteIP = addr.GetAddressBytes();

БП>    if (byteIP.Length != 4)
БП>        throw new NotSupportedException("IPv6 идёт лесом.");
    
БП>    return BitConverter.ToInt32(byteIP, 0);
БП>


Подставь в свой код IPAddress.Parse("192.168.255.255") и посмотри что получилось.
А что не так?
От: Блудов Павел Россия  
Дата: 12.09.07 00:29
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Подставь в свой код IPAddress.Parse("192.168.255.255") и посмотри что получилось.

Если Вы про порядок байт, то в задаче он не оговаривался.
... << RSDN@Home 1.2.0 alpha rev. 746>>
Re: А что не так?
От: Аноним  
Дата: 12.09.07 09:14
Оценка: :)
Здравствуйте, Блудов Павел, Вы писали:

БП>Здравствуйте, <Аноним>, Вы писали:


А>>Подставь в свой код IPAddress.Parse("192.168.255.255") и посмотри что получилось.

БП>Если Вы про порядок байт, то в задаче он не оговаривался.

Я про переполнение, так как IP нельзя приводить к int 32. Не зря свойство Address имеет тип int 64. И твой вариант будет работать в 50% случаев.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.