Skocz do zawartości

Socket W Fpc


Lukasz69

Rekomendowane odpowiedzi

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

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 1
127 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

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

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

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

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ę
×
×
  • Dodaj nową pozycję...