DWORDin muuttaminen IP-osoitteeksi

Probleema koskee Visual C :aa ja on seuraavanlainen:


Minulla on dialogissani "IP address"-tyyppinen objekti. Siis se tekstikentän näköinen objekti jossa on kolme pistettä valmiina. Olen luonut jäsenmuuttujan, johon tallentuu IP address -objektiin näppäilty IP-osoite DWORD-tyyppisenä.

Haluaisin nyt käyttää osoitetta socketin perustamiseen, mutta soketin struktuurissa (soketti.sin_addr.s_addr) osoitteen pitäisikin olla u_long -muodossa.

Kuinka saan sen muunnettua tuohon muotoon??
10644
Äänestä

Muut lukivat myös

Vastaukset 10

Vanhimmat

u_long on siis unsigned long, jonka koko on 4294967295. Dword on 4 tavua, eli senkin koko on 4294967295. Voit siis tehdä ihan yksinkertaisesti näin: (u_long)iposote

Äänestä

IP-osoite on perinteisesti tyyppiä aaa.bbb.ccc.ddd, jossa jokainen osa on 0-255 välillä oleva numero. Osoite voidaan kuitenkin esittää myös yhtenä numerona, joka lienee se mitä u_long tässä tarkoittaa.

Tämä on hatara muistikuva ja on varmasti helpompikin keino ja muunnos ei ole välttämättä 100% oikein ja ja..., mut..

Vetaisen ensin strtok:lla tms. osoite palasiksi pisteiden kohdalla. Saat neljä numeromerkkijonoa, jotka sitten muutat atoi:lla inteiksi. Olkoon nuo a_1=aaa, a_2=bbb jne. Määrittele u_long kohde=0; ja aseta sen arvoksi
kohde = ( (a_1

Äänestä
  • Noinhan se menee mutta tässä yhteydessä ei malta olla mainostamatta kuinka helppoa tuo olisi tehdä Pythonilla:

    ip = "10.1.2.3"
    q = ip.split(".")
    print (hex(reduce(lambda a,b: long(a)*256 long(b), q)))

    Äänestä

  • nätisti kirjoitti:

    Noinhan se menee mutta tässä yhteydessä ei malta olla mainostamatta kuinka helppoa tuo olisi tehdä Pythonilla:

    ip = "10.1.2.3"
    q = ip.split(".")
    print (hex(reduce(lambda a,b: long(a)*256 long(b), q)))

    Mutta kysymyksen esittäjähän sanoi että ip-osoite tulee sieltä ip controllista suoraan DWORD-muodossa, eli ei missään xxx.xxx.xxx muodossa vaan ihan pelkkänä numerosarjana ilman pisteitä. Tällöin pystyy käyttämään normaalia typecastausta (tyyppi)toisentyyppinen_muuttuja

    Äänestä

  • ninimerkki34892758 kirjoitti:

    Mutta kysymyksen esittäjähän sanoi että ip-osoite tulee sieltä ip controllista suoraan DWORD-muodossa, eli ei missään xxx.xxx.xxx muodossa vaan ihan pelkkänä numerosarjana ilman pisteitä. Tällöin pystyy käyttämään normaalia typecastausta (tyyppi)toisentyyppinen_muuttuja

    Yritin tuota typecastausta, jonka tosiaan periaatteessa pitäisi toimia. Jostain syystä en kuitenkaan saanut sitä pelaamaan, vaan socketin käyttöönotto ko. arvolla ei onnistu (setsockopt palauttaa arvon WSAEADDRNOTAVAIL eli "Can't assign requested address"). Debuggauksen perusteella osoite näyttäisi mystisesti muuttuvan pelkiksi nolliksi.

    IP Controllista saa IP-osoitteen otettua myös neljänä BYTE-tyyppisenä arvona GetAddress()-metodilla. Olen koettanut myös muuttaa nämä arvot merkkijonoksi ja syöttää sen osoitteeksi tyyliin soketti.sin_addr.s_addr = inet_addr(merkkijono).

    Tämäkään ei kuitenkaan ole toistaiseksi onnistunut, vaan kääntäjä herjaa epäonnistuneista tyyppimuunnoksista, kun merkkijononi ei satu olemaan juuri oikeaa tyyppiä :-/

    Äänestä

  • lataamo here I come kirjoitti:

    Yritin tuota typecastausta, jonka tosiaan periaatteessa pitäisi toimia. Jostain syystä en kuitenkaan saanut sitä pelaamaan, vaan socketin käyttöönotto ko. arvolla ei onnistu (setsockopt palauttaa arvon WSAEADDRNOTAVAIL eli "Can't assign requested address"). Debuggauksen perusteella osoite näyttäisi mystisesti muuttuvan pelkiksi nolliksi.

    IP Controllista saa IP-osoitteen otettua myös neljänä BYTE-tyyppisenä arvona GetAddress()-metodilla. Olen koettanut myös muuttaa nämä arvot merkkijonoksi ja syöttää sen osoitteeksi tyyliin soketti.sin_addr.s_addr = inet_addr(merkkijono).

    Tämäkään ei kuitenkaan ole toistaiseksi onnistunut, vaan kääntäjä herjaa epäonnistuneista tyyppimuunnoksista, kun merkkijononi ei satu olemaan juuri oikeaa tyyppiä :-/

    Jos kokeilisit muuttaa ne BYTEt sitten semmoseksi pilkuilla erotelluksi merkkijonoksi. Jotenkin näin:

    char temp[200];
    sprintf(temp,"%d.%d.%d.%d",byte1,byte2,byte3,byte4);

    ja sitten annat tuon tempin sille socketille

    Äänestä

  • ninimerkki34892758 kirjoitti:

    Mutta kysymyksen esittäjähän sanoi että ip-osoite tulee sieltä ip controllista suoraan DWORD-muodossa, eli ei missään xxx.xxx.xxx muodossa vaan ihan pelkkänä numerosarjana ilman pisteitä. Tällöin pystyy käyttämään normaalia typecastausta (tyyppi)toisentyyppinen_muuttuja

    "ip-osoite tulee sieltä ip controllista suoraan DWORD-muodossa, eli ei missään xxx.xxx.xxx muodossa vaan ihan pelkkänä numerosarjana ilman pisteitä"

    Mikä tyyppi tuo DWORD on? Jos siinä on esim. IP-osoite 123.234.345.45 "suoraan ilman pisteitä", niin miksi se muuttuisi typecastaamalla suoraan halutuksi numeroksi? En ymmärrä miksi näin olisi, mutta en olekaan tietoinen koko DWORD-tyypistä.

    Alkup: kokeilitko muuttaa osoitteen verkon tavujärjestykseen hton-funktiolla ennen sen käyttämistä?

    Äänestä

  • luulija kirjoitti:

    "ip-osoite tulee sieltä ip controllista suoraan DWORD-muodossa, eli ei missään xxx.xxx.xxx muodossa vaan ihan pelkkänä numerosarjana ilman pisteitä"

    Mikä tyyppi tuo DWORD on? Jos siinä on esim. IP-osoite 123.234.345.45 "suoraan ilman pisteitä", niin miksi se muuttuisi typecastaamalla suoraan halutuksi numeroksi? En ymmärrä miksi näin olisi, mutta en olekaan tietoinen koko DWORD-tyypistä.

    Alkup: kokeilitko muuttaa osoitteen verkon tavujärjestykseen hton-funktiolla ennen sen käyttämistä?

    Nyt vaikuttaa siltä, että homma toimii! Alunperin esitetty typecastaus toimii, mutta minulta puuttui se htonl()-funktio.

    Eli, kun osoite tulee IP controllilta DWORD-tyyppisessä jäsenmuuttujassa m_Mcip, annan osoitteen soketille näin:

    ulIP = (u_long)m_Mcip;
    soketti.imr_multiaddr.s_addr = htonl(ulIP);


    Edellisen viestin kysyjälle: DWORD on Windowsin omia datatyppejä, ja on määritelmän mukaan "32-bit unsigned integer", eli "typedef unsigned long DWORD;" Datatyypin u_long määritelmä on täsmälleen sama. Windows omine datatyyppeineen ja tyyppimuunnoksineen tekee minut pian hulluksi!

    Paljon kiitoksia neuvoista!

    Äänestä

  • lataamo here I come kirjoitti:

    Nyt vaikuttaa siltä, että homma toimii! Alunperin esitetty typecastaus toimii, mutta minulta puuttui se htonl()-funktio.

    Eli, kun osoite tulee IP controllilta DWORD-tyyppisessä jäsenmuuttujassa m_Mcip, annan osoitteen soketille näin:

    ulIP = (u_long)m_Mcip;
    soketti.imr_multiaddr.s_addr = htonl(ulIP);


    Edellisen viestin kysyjälle: DWORD on Windowsin omia datatyppejä, ja on määritelmän mukaan "32-bit unsigned integer", eli "typedef unsigned long DWORD;" Datatyypin u_long määritelmä on täsmälleen sama. Windows omine datatyyppeineen ja tyyppimuunnoksineen tekee minut pian hulluksi!

    Paljon kiitoksia neuvoista!

    Joo, unohtu mainita tuosta hton-funktiosta aiemmin.

    "DWORD on Windowsin omia datatyppejä, ja on määritelmän mukaan "32-bit unsigned integer", eli "typedef unsigned long DWORD;" "

    Just, ok. Enpä tuota tiennyt. Ketjusta sai vain kuvan, että joko
    -käyttäjä antaa ip-osoitteen pisteineen ja se tallentuu sellaisenaan muuttujaasi (jonka luulin oleva merkkijono tjsp.), tai
    -käyttäjä antaa ip-osoitteen pisteineen ja se tallentuu *ilman pisteitä*, joka on tietysti eri asia kuin sen muuttaminen numeroksi mainitulla tavalla.

    Näin sitä aina oppii :) Tämä on kyllä oikein tutkijahenkisen ala.

    "Windows omine datatyyppeineen ja tyyppimuunnoksineen tekee minut pian hulluksi! "

    Et ole ainoa joka tuota valittaa :) Itse en ole koskenut kuin unixeihin - onneksi.

    Äänestä

  • nätisti kirjoitti:

    Noinhan se menee mutta tässä yhteydessä ei malta olla mainostamatta kuinka helppoa tuo olisi tehdä Pythonilla:

    ip = "10.1.2.3"
    q = ip.split(".")
    print (hex(reduce(lambda a,b: long(a)*256 long(b), q)))

    Kuulehan nyt persereikä, kun nyt ei tehdä koodia millään tulkattavalla pythonilla!!!

    Äänestä

Kommentoi aloitusta


lataamo here I come kirjoitti:

Probleema koskee Visual C :aa ja on seuraavanlainen:


Minulla on dialogissani "IP address"-tyyppinen objekti. Siis se tekstikentän näköinen objekti jossa on kolme pistettä valmiina. Olen luonut jäsenmuuttujan, johon tallentuu IP address -objektiin näppäilty IP-osoite DWORD-tyyppisenä.

Haluaisin nyt käyttää osoitetta socketin perustamiseen, mutta soketin struktuurissa (soketti.sin_addr.s_addr) osoitteen pitäisikin olla u_long -muodossa.

Kuinka saan sen muunnettua tuohon muotoon??

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu