» »

[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:
/****************
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,

fx ::

Zadeva deluje, skoraj v celoti samo pošiljanje in sprejemane gre po sistemu pinkpong žogice. Primer si lahko ogledate tukaj.

Lp,


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c] ne sprejme UDP paketa

Oddelek: Programiranje
7992 (580) slovencl
»

[C++] bind

Oddelek: Programiranje
61458 (1236) fiction
»

Delo z omrezjem v linuxu

Oddelek: Programiranje
101310 (1156) CCfly
»

C: connect() funkcija, kako nastaviti timeout

Oddelek: Programiranje
231787 (1568) fefko-the-bulldog
»

Casovni problem v C/C++

Oddelek: Programiranje
91259 (1160) sid_dabster

Več podobnih tem