Forum » Programiranje » [C] Problem s socketi
[C] Problem s socketi
mov ax 0x7c0 ::
Imam en problem ko zelim z odjemalcem proziti neko zahtevo,... Mi streznik s katerim vspostevljam povezavo ne odgovori. V kodi spodaj mora nekaj manjkati pa nikakor ne vem kaj? Ce kdo kaj opazi naj pove, prosim
lp, Slavko
Koda:
lp, Slavko
Koda:
/**************** odjemalec ****************/ int set_client(char* adress, int vrata, SOCKET *s){ SOCKADDR_IN saddr; *s = socket(AF_INET, SOCK_STREAM, 0); memset(&saddr, sizeof(saddr), 0); saddr.sin_family = AF_INET; saddr.sin_port = htons(vrata); saddr.sin_addr.s_addr = inet_addr(adress); int povezi = connect(*s, (struct sockaddr*)&saddr, sizeof(saddr)); if(povezi != 0){ cout << "Ne morem se povezati na ta streznik!"; cout <<endl; cout <<"Napaka: "<< povezi<<endl; return povezi; } return 0; } /*********** sprejemanje ***********/ int sprejmi_sporocilo(char* buffer, int max_dolzina, SOCKET s) { char lokalni_buffer[10000]; // v enem klicu prejmemo maksimalno 128 znakov int sprejetih_znakov; int sprejetih_znakov_skupaj=0; bool konec=false; int zaporednih=0; do { sprejetih_znakov=recv(s,lokalni_buffer,max_dolzina,0); for (int f=0;f<sprejetih_znakov;f++) { buffer[sprejetih_znakov_skupaj]=lokalni_buffer[f]; if (sprejetih_znakov==SOCKET_ERROR) { return 0; } sprejetih_znakov_skupaj++; if (lokalni_buffer[f]==10 || lokalni_buffer[f] == 13){ zaporednih ++; } else zaporednih = 0; if(zaporednih = 4) konec = true; } } while ((sprejetih_znakov>0)&&(!konec)); return sprejetih_znakov_skupaj; } /*********** posiljanje ***********/ int poslji_sporocilo(const char* buffer, int dolzina, SOCKET s) { int poslanih_znakov; int poslanih_znakov_skupaj=0; int pom_dolzina=dolzina; do { poslanih_znakov=send(s,&buffer[poslanih_znakov_skupaj],dolzina,0); if (poslanih_znakov==SOCKET_ERROR) { return 0; } poslanih_znakov_skupaj+=poslanih_znakov; pom_dolzina-=poslanih_znakov; } while (pom_dolzina>0); return dolzina; } int main(int arg, char* argc[]){ WSADATA wsa; SOCKADDR_IN Caddr; SOCKET a1; WSAStartup(MAKEWORD(1,1), &wsa); if(arg == 1){ set_streznik(80, &a1); int len = sizeof(Caddr); SOCKET a2 = accept(a1, (struct sockaddr *)&Caddr, &len); int spr; char buffer[10000]; spr=sprejmi_sporocilo(buffer,10000,a2); buffer[spr]='\0'; fstream dat; dat.open("recv.txt", ios::app); dat.write("SERVER BY SLAVC\n", 16); dat.write(buffer, spr); dat.close(); cout << buffer << endl; shutdown(a2,2); closesocket(a2); closesocket(a1); } else { if(set_client(argc[1], 80, &a1)){ cout <<"Povezava s streznikom ni uspela!"; cout <<endl; return 1; } int spr; cout <<"Povezava na streznik je uspela"<<endl << endl; char* masage = "GET /index.html HTTP/1.0 \n"; poslji_sporocilo(masage, sizeof(masage), a1); char buffer[10000]; spr=sprejmi_sporocilo(buffer,10000,a1); buffer[spr]='\0'; cout <<endl<<"**"<< spr<<endl; fstream dat; dat.open("recv.txt", ios::app); dat.write("CLIENT BY SLAVC\n", 16); dat.write(buffer, spr); dat.close(); cout << buffer<<endl; closesocket(a1); } return 0; }
- spremenilo: snow ()
NoUse4AName ::
SOCKET a2 = accept(a1, (struct sockaddr *)&Caddr, &len);
int spr;
char buffer[10000];
spr=sprejmi_sporocilo(buffer,10000,a2);
zapomni si to, po VSAKEM klicu kaksne socket funkcije moras dat odspodaj if stavek, ki preveri ce je slucajno vrnjena vrednost INVALID_SOCKET (ti vidim da imas napisano SOCKET_ERROR, ne vem v cem je razlika, ker moj program za posiljanje datotek preko interneta uporablja INVALID_SOCKET), to je absolutno nujno. In ce je prislo do napake naj se izpise kje je prislo do napake.
for (int f=0;f buffer[sprejetih_znakov_skupaj]=lokalni_buffer[f];
if (sprejetih_znakov==SOCKET_ERROR) {
return 0;
}
sprejetih_znakov_skupaj++;
...
ce nameravas posiljati datoteke preko interneta si zapomni to da bo do zgubljenih paketkov VEDNO prihaja, tudi ce imas nevem kako stabilno povezavo torej ce je datoteka vecja si pecen, ce manjsa bos mogoce imel sreco.
fx ::
Do sedaj mi je uspelo narediti da se je client povezo na server in je server samo sprejemo sproročila in jih prikazoval. Obratno pa mi ne uspeva. In me zdaj zanima če imam vsaj v osnovi prav zastavljeno kako bi zadeva delovla:
Server
1. socket
2. bind
3. listen -> close //z možnostjo da se zapre
4. accept //se ponavlja dokler se client ne poveže
5. send/recv //se ponavlja v zanki
6. shotdown
7. close
Cliet
1. socket
2. connect
3. send/recv //se ponavlja v zanki
4. shotdown
5. close
Lp,
Server
1. socket
2. bind
3. listen -> close //z možnostjo da se zapre
4. accept //se ponavlja dokler se client ne poveže
5. send/recv //se ponavlja v zanki
6. shotdown
7. close
Cliet
1. socket
2. connect
3. send/recv //se ponavlja v zanki
4. shotdown
5. close
Lp,
fx ::
Zadeva deluje, skoraj v celoti samo pošiljanje in sprejemane gre po sistemu pinkpong žogice. Primer si lahko ogledate tukaj.
Lp,
Lp,
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [c] ne sprejme UDP paketaOddelek: Programiranje | 992 (580) | slovencl |
» | [C++] bindOddelek: Programiranje | 1458 (1236) | fiction |
» | Delo z omrezjem v linuxuOddelek: Programiranje | 1310 (1156) | CCfly |
» | C: connect() funkcija, kako nastaviti timeoutOddelek: Programiranje | 1787 (1568) | fefko-the-bulldog |
» | Casovni problem v C/C++Oddelek: Programiranje | 1259 (1160) | sid_dabster |