prosty serwer www

0

Siema
Zacząłem uczyć się programować w sieci. Ściągnąłęm kilka kursów itd. Wramach nauki zrobiłem prościutki chat a teraz chce serwer www. Mam taki kod:

WSAStartup( MAKEWORD( 2 , 0 ) , &WSD);
sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
Addr.sin_family = AF_INET;
Addr.sin_port = htons(80);
Addr.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
memset(Addr.sin_zero , 0, 8 );
int bind (SOCKET s, const struct sockaddr FAR* name,  int namelen );
listen(sock,2);

recvfrom(sock, buf, 1024, 0, (sockaddr*)&Addr, &s );
sendto( sock, "<html><body>Siema</body></html>", 9, 0, 
        (sockaddr*)&Addr, sizeof( sockaddr ) );
cout<< buf;

closesocket(sock);
WSACleanup( );

Wszystko ladnie sie kompiluje, ale nie dziala. Dokladniej to caly program sie wykonuje i sie zamyka. Nie czeka na polaczenie. Co jest nie tak?? [glowa]

0

Hmm z tego co mi sie wydaje to na moje oko brakuje pętli i funkcji accept..
http://klepisko.eu.org/~bartek/bgnet/html/index.html
Tu bedzie troche :)

0

Pętli nie musi (chyba) być. Program obsłuzy jednego goscia i zakonczy (nie ma tu sensu ale to tylko przyklad) a co do accept to sie uzywa chyba tylko do gniazd strumieniowych.

0

Heh no wlasnie jak chcesz serwer to własnie uzyj gniazd strumieniowych...

0

ale do serwera www uzywa sie gniazd datagramowych

0

Hmm z tego co ja wiem to do tego typu serwerów uzywa sie gniazd strumieniowych, napisalem jeden serwer (daytime) i dziala dobrze :P

1

ale do serwera www uzywa sie gniazd datagramowych

ekhem... gdzies takie madre rzeczy wyczytal ?:PPP
hehe a tak serio tyo HTTP chodzi na porcie 80 TCP...
UDP jest w wiekszosci przez gierki i DNSa wykozystywany ( chodz afair ten ostatni przez TCP )
wejdz sobie na onet i odpal netstat tyo zobaczysz ;>

0

to jak taki serwer zrobic?? pomozcie bo ja juz nie wiem ;-(

0

Na stronie co ci dalem masz prosciutki serwer, mozesz takze wykorzystac moje zrodla od deamona daytime tyle ze bedziesz musial zmienic port na 80 i przy send wyslac cos do przegladarki :P

0

Możesz też looknąć w mój kod napisany w BCB :)

http://4programmers.net/download.php?id=1511

0

Czym się różnią gniazd datagramowych od gniazd strumieniowych?
Gdzie można znaleźć informacje na ten temat?
[cygaro]

0

qrde ludzie www.google.com to po jako sabake istnieje [glowa]
http://klepisko.eu.org/~bartek/bgnet/html/index.html
ruszyć dupe a nie forum zasmiecac [diabel]

0

Oj cepa, alez ty niecierpliwy ;>

odpowiadajac na pytanie (wszystko jest IMHO i AFAIC i AFAIR ;p):
gniazda strumienowe (TCP) charakteryzuja sie duza pewnoscia dostarczenia przesylki, ale kosztem wiekszej ilosci przeslanych informacji...
mianowicie host po otrzymaniu pakietu odsyla jego checksum (sume kontrolna ;>).. jesli komp ktory wyslal uzna ze checksum sie rozni, to wysyla pakiet jeszcze raz.. i tak do skutku
tak jest jakas tam pewnosc ze pakiet dotrze caly niepopsoooty do celu
poza tym w TCP istnieje cos takiego jak polaczenia.. mianowicie komputer nie wysyla na slepo pakietow, tylko najpierw ustanawia polaczenie, a potem dopiego wysyla pakiety....
polaczenie ustanawia sie za pomoca 3ch pakietow... zalozmy ze komp A chce nawiazac polaczenia z kompem B
A -> B: SYN (chce nawiazac polaczenie z toba!)
B -> A: ACK (spoko, jestem za)
A -> B: SYN ACK (wiec jestesmy polaczeni ;>)
SYN i ACK to ofc flagi pakietu TCP...
pakiety moga byc wysylane tylko gdy polaczenie jest nawiazane...
polaczenie ofc moze zostac zerwane przez ktorys z kompow (flaga RST)
etc.. wiecej w rfc od TCP jest ;>

natomiast datagramy, czyli UDP dzialaja bez polaczen.. pakiety po prostu leca do kompa, wcale nie jest powiedziane ze tamten komp na nie oczekuje, ani czy dotra (nie ma kontroli bledow jak w TCP)...
ale sa i dobre strony.. zalozmy ze co sekunde wysylamy pakiet z czasem... wtedy jesli jakis pakiet dojdzie z lagiem (tzn chodzi mi ze np bedzie 10 razy musial bys wysylany, zanim nastepny bedzie mogl byc wyslany) (TCP) , tyo sie wszystko popsoooje.. a jesli jakis tam pakiet zginie, a reszta dojdzie bez opoznienia spowodowanego tamtym zaginionym pakietem... (ofc moga byc opoznienia spowodowane czymkolwiek innym)....

tak ze UDP nadaje sie super do gierek (quake na tcp == aua)...
a TCP do protkolow w ktorych fajnie by bylo zeby dane byly pewne albo (i) nie zalezy nam takiej super mega szybkosci (hehe ofc przesadzam... udp jest minimalnie szybsze od tcp)

0

ruszyć dupe a nie forum zasmiecac

Zawsze wydawało mi się, forum istnieje od tego by udzielać ludziom rad. Ale widzę,że forum służy raczej do używania pewnych obraźliwych słów i pokazania swego zadufanego "ego".
Bardzo dziękuję za świetne wytłumaczenia różnic bo pod adresem
http://klepisko.eu.org/~bartek/bgnet/html/index.html
jest może napisane co to jest gniazdo, ale różnic nie widziałem.
Moje pytanie jest jeszce takie:

gniazda strumieniowe korzystają z IP dla routingu, ale nie wykorzystują TCP?

Ty piszesz natomiast,że mianowicie host po otrzymaniu pakietu odsyla jego checksum (sume kontrolna). Zawsze wydawało mi się, że sumy kontrolne przesyłane są w warstwie transportowej.

0

ruszyć dupe a nie forum zasmiecac

Zawsze wydawało mi się, forum istnieje od tego by udzielać ludziom rad. Ale widzę,że forum służy raczej do używania pewnych obraźliwych słów i pokazania swego zadufanego "ego".
Bardzo dziękuję za świetne wytłumaczenia różnic bo pod adresem
http://klepisko.eu.org/~bartek/bgnet/html/index.html
jest może napisane co to jest gniazdo, ale różnic nie widziałem.
Moje pytanie jest jeszce takie:

gniazda strumieniowe korzystają z IP dla routingu, ale nie wykorzystują TCP?

Ty piszesz natomiast,że mianowicie host po otrzymaniu pakietu odsyla jego checksum (sume kontrolna). Zawsze wydawało mi się, że sumy kontrolne przesyłane są w warstwie transportowej.

No dobra zgodze sie ze przesadzam ;-)
Ale czasami moze najpierw wpisac na googlach: UDP TCP Sockets Tutorial lub cos w tym stylu...

1

re...
moze tym razem uda mi sie posta zamiescic pod nickiem.. argh ;p

ale wracajac do tematu... (znowu IMHO, AFAIR I AFAIC)
k.. rzucilem sie do RFC zeby cie nie oklamac (moze mi sie uda)...
tych checksumoow tam jest sporo...

  1. w warstwie IP
    --cut-- (cytat z rfc 791)
    Header Checksum: 16 bits
    A checksum on the header only. Since some header fields change
    (e.g., time to live), this is recomputed and verified at each point
    that the internet header is processed.
    --cut--
    ten checksum pozwala upewnic sie czy wszystko w adresach i typie danych i w ogóle naglowku pakietu IP gra...

  2. w warstwie TCP
    --cut-- (cytat z rfc 793)
    Checksum: 16 bits
    The checksum field is the 16 bit one's complement of the one's
    complement sum of all 16 bit words in the header and text.
    ....
    --cut--
    czyli kolejny checksum, ten wysylany or sth ;>

... (tutaj trwaja poszukiwania w rfc)
...( oo... "three-way handshake".. tak sie ten SYN, ACK, SYN ACK zwalo ;p)...

a jest ;>
nyo masz racje... tyo komp wysylajacy zawiera checksum w swoim pakiecie.. i nawet wysyla pakiety (te same) az nie dostanie odpowiedzi...
ale potwierdzenie przyjecia i tak jest wysylane...

-- cut -- (ten sam rfc co poprzednio)
[..] the sender creates a segment and transmits it [....]
[...] the receiver accepts a segment [...] and sends an acknowledgment.
-- cut --

Co do pytania o routing...
anom tcp nie wykozystuja...
ale od routingu jest warstwa ip.. nie wazne dzieki temu czy slemy tcp, udp czy icmp, czy jakies inne cos...
UDP i TCP to ta sama rodzina.. oba sa zalezne od IP (w przeciwienstwie do IPXa)
z tego co kojarze router nawet nie sprawdza co za rodzaj pakietu dostaje... po prostu patrzy na adres docelowy zawarty w naglowkooo ip i posyla pakiet dalej.... (poprawka: oczywiscie jesli musi to patrzy co to, czy to nie jest ICMP, czy to nie jest cos co powinien zablokowac etc)

taki pakiet w sumie wyglada tak...
[ NAGLOWEK IP ][ NAGLOWEK TCP lub UDP ][ DANE ]

z kazda warstwa rosnie ilosc naglowkoow ;p

hmm jesli w pytaniu o cos innego chodzilo tyo sproobooj dokladniej wyjasnic o co ;>

1 użytkowników online, w tym zalogowanych: 0, gości: 1