Lukasz69 Napisano Grudzień 8, 2006 Zgłoszenie Share Napisano Grudzień 8, 2006 Witam! Wlasnie stawiam pierwsze kroki w probie poznania socketow. Pisze w FPC i mam nastepujacy problem: W przykladzie zastosowania socketow (przyklad z klientem) mam nastepujacy zapis: { localhost : 127.0.0.1 in network order } SAddr.sin_addr.s_addr:=HostToNet((127 shl 24) or 1); Z tym mam problem - szukalem po necie ale nie znalazlem nic co bym zrozumial - jak w takim razie zapisac adres 10.0.0.2 na przyklad? Myslalem ze funkcja StrToNetAddr moze zastapic HostToNet ale tak nie mozna a nie rozumiem zapisu ktory jest w HostToNet. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
jjj Napisano Grudzień 8, 2006 Zgłoszenie Share Napisano Grudzień 8, 2006 Adres IPv4 jest liczba 32-bitowa. W konwencji z kropkami pisze sie ja tak: abc.def.ghi.jkl, gdzie abc = adres div 2^24 def = (adres mod 2^24) div 2^16 ghi = (adres mod 2^16) div 2^8 jkl = (adres mod 2^8) Czyli w druga strone adres = jkl + 256*(ghi + 256*(def + 256*abc)) W Twoim przykladzie (127 shl 24) or 1127 to jest sto dwadziescia siedem. 127 shl 24 = 127*2^24 = 127*256^3 w notacji IPv4 bedzie to 127.0.0.0 koncowe or 1 ustawia ostatni bit na 1 (czyli dodaje jeden, jezeli liczba konczyla sie zerem). Nie wiem czy musisz czytac o socketach -- pewnie nie zaszkodzi -- ale poczytaj o operacjach binanych na liczbach calkowitych. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Lukasz69 Napisano Grudzień 8, 2006 Autor Zgłoszenie Share Napisano Grudzień 8, 2006 To moje poczatki na socketach i wielkie dzieki za odpowiedz Teraz moj nedzny poczatkujacy programik dziala. Mam jeszcze jedno pytanie: czy funkcjmi StrToNetAddr i tym podobnymi nie da sie dojsc do tego adresu o ktory pytalem? W sumie mozna napisac funkcje ktora zwroci adres ale ciekaw jestem czy to jest w socketach czy nie. Co do ksiazki to wypatrzylem na uczelni w bibliotece Gay Warren W. Linux Gniazda w programowaniu - poczytam ja troche to dowiem sie co to host i network address i z czym to sie je. Pozdrawiam. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
jjj Napisano Grudzień 8, 2006 Zgłoszenie Share Napisano Grudzień 8, 2006 Za http://www.freepascal.org/docs-html/rtl/sockets/in_addr.html : function HostToNet(Host: in_addr):in_addr; function HostToNet(Host: LongInt):LongInt; //Description //HostToNet converts a host address to a network address. It takes care of endianness of the host machine. The address can be specified as a dotted quad or as a longint. Albo podajesz adres w postaci danej typu in_addr zgodnie z pierwszym prototypem funkcji, albo w postaci danych typu longint zgodnie z drugim -- tak jak to zrobiłeś. Zależnie od wariantu odbierzesz wynik typu in_addr lub typu longint: //Przy var net, host: in_addr; adr: longint; //wywołania host := strToHostAddr('127.0.0.1'); net := hostToNet(host); net := hostToNet(strToHostAddr('127.0.0.1')); //są legalne, podobnie jak adr := hostToNet((127 shl 24) + 1); Za http://www.freepascal.org/docs-html/rtl/sockets/in_addr.html : //Source position: socketsh.inc line 73 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; s_addr i s_bytes to 2 uzupełniające spojrzenia na te same dane; możesz odwołać się do host.s_addr albo do host.s_bytes[], ale nie do host.s_addr.s_bytes[]. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Lukasz69 Napisano Grudzień 8, 2006 Autor Zgłoszenie Share Napisano Grudzień 8, 2006 Czytalem ta dokumentacje ale najwyrazniej nie zrozumialem prawidlowo - dzieki jeszcze raz za pomoc. Zaczynam sie powoli lapac jak wykorzystywac takie dokumentacje - jednak przyzwyczajenia do obszernych opisow funkci i procedur jakie ma miejsce z biblioteka crt daje o sobie znac. Zrobilem socketa - laczy sie z komputerem w sieci 10.0.0.4 na ktorym mam Apache. Na tym komputerze jest strona do ktorej moge wejsc wpisujac w przegladarke 10.0.0.4/netfooty i otwiera sie strona. Chcialbym by moje gniazdko odczytywalo zawartosc tej strony ale po wyslaniu zapytania program czeka na odpowiedz z 4 minuty po czym wyrzuca mi komunikat HTTP/1.1 400 Bad Request. Kod programu odpowiadajacy za wyslanie zapytania wyglada tak: SAddr.sin_family:=AF_INET; SAddr.sin_port:=htons(80); SAddr.sin_addr:=HostToNet(strtohostaddr('10.0.0.4')); Connect(s,SAddr,soin,soou); reset(soin); rewrite(soou); buffer:='GET /netfooty/index.php HTTP/1.1 #13#10 Host: 10.0.0.4 #13#10 User-Agen: Smith #13#10'; writeln(soou,Buffer); Flush(soou); readln(soin,buffer); writeln(buffer); close(soou); Zmienne soou i soin sa typu TEXT. Dodam ze jesli jako buffer podam dowolny ciag znakow i wszystko pojdzie na 10.0.0.4 to wypisuje mi strone 10.0.0.4/index.php a jak zrobie zapytanie jak w kodzie powyzej to otrzymuje error o kodzie 400. Co jest nie tak? W poniedzialek pozycze jakas ksiazke na temat socketow wiec moze przestane co chwila pytac. EDIT: poradzilem sobie - po prostu #13#10 nie powinien byc wewnatrz ciagu znakow Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się