miercuri, 6 iulie 2011

tutorial server/client c++

crearea unei aplicati client/server in c++

1.sockets

un socket este componenta unei aplicati de retea prin care se trimit si se receptioneaza date,adica el face legatura intre calculatorul client si calculatorul server, comunicarea dintre doua socketuri poate fi de 2 feluri , acest tutorial este pentru socketurile tcp
deasemenea recomand cartea tcp/ip, a pus-o cineva pe forum acum ceva timp,intelegi ceva mai bine socketurile


*aceasta este basica socketurilor,explicatiile nu sunt foarte complexe cum nici codurile nu sunt
2 clientul
clientul nostru va rula si va trimite catre server string-ul ruleaza|notepad.exe care urmeaza a fi prelucrat de catre server

#include<winsock2.h>//headerul folosit pentru winsock
#include<stdio.h>


WSADATA wsaData;
int socke;// socketul nostru
sockaddr_in server;// structura sockaddr_in

int conn;// conexiunea
int sendstring;//functia de trimitere

unsigned int strlenr;//lungimea stringului care urmeaza a fi trimis
char echosend[]="ruleaza|notepad.exe|";//stringul care va fi trimis
main()
{
AllocConsole();// ii alocam o consola
rezultat=WSAStartup(MAKEWORD(2,2),&wsaData);

socke=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//creem socketul,ia 3 parametri familia de ip-uri AF_INET adica ipv4,sock_stream tipul de socket sock strea, fiind cel pentru protocolul tcp si ultimul parametru este protocolul

server.sin_family=AF_INET;//familia de ip-uri
server.sin_addr.s_addr=inet_addr("127.0.0.1");//ip-ul la care se va conecta
server.sin_port=htons(1234);// portul tradus in formatul retelei

conn=connect(socke,(struct sockaddr*)&server,sizeof(server));// conectarea,structuta sockaddr_in este convertita in sockaddr,functia ia 3 parametri socketul structura in care sunt memeorate adresa ip,portul si familia de ip-uri, si marimea structuri in octeti
strlenr=strlen(echosend);//calculam lungimea mesajului ce urmeaza a fi trimis
sendstring=send(socke,echosend,strlenr,0);// se trimite stringul functia ia 4 parametri socketul,stringul care urmeaza a fi trimis,si lungimea acestuia

}


3. server
la primirea stringului ruleaza|notepad.exe| se va rula notepad
voi pune comentari doar la ce a aparut nou fata de codul precedent

#include<winsock2.h>
#include<stdio.h>
#include<conio.h>



SOCKET socke;
WSADATA wsaData;
SOCKET AcceptSocket;
sockaddr_in client;
char *tokenul1;// pointer pentru functia strtok
char *tokenul2;//pointer pentru functia strtok
main()
{

AllocConsole();

WSAStartup(MAKEWORD(2,2),&wsaData);

socke=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

client.sin_family=AF_INET;
client.sin_addr.s_addr=inet_addr("127.0.0.1");
client.sin_port=htons(1234);

bind(socke,(struct sockaddr*)&client,sizeof(client));// acum vom lipi structura sockaddr_in care contine datele despre client, functia bind ia 3 parametri socketul,structura(sockaddr),si marimea in biti
listen(socke,5);//setam serverul sa astepte conexiuni pe acel socket, listen ia 2 parametri socketul si numarul maxim de conexiuni eu am pus 5

while (1) {
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( socke, NULL, NULL );//folosim accept pentru a accepta conexiunea in general functia ia 3 parametri dar cum deja avem toate datele lipite la socket vom pune doar socketul si la celelalte vom pune null adica nimic
}
socke = AcceptSocket;
break;
}
int bytesRecv;
char recvbuf[32] = "";//golim stringul in care urmeaza a fi receptionate datele
bytesRecv = recv( socke, recvbuf, 32, 0 );// receptionam datele functia recv ia 4 parametri socketul,stringul primit marimea acestuia si flag 0


tokenul1=strtok(recvbuf,"|");//impartim stringul in tokene folosind strtok
tokenul2=strtok(NULL,"|");
if(strcmp(plo,"ruleaza")==0)
system(pl);//daca ne-a venit ruleaza| atunci rulam ce urmeaza dupa ruleaza| adica notepad.exe


cprintf("apasa o tasta");
getch();

}

server
Code:
#include<winsock2.h>
#include<stdio.h>
#include<conio.h>



SOCKET socke;
WSADATA wsaData;
SOCKET AcceptSocket; 
sockaddr_in client;
char *plo;
char *pl;
main()
{

AllocConsole();

  WSAStartup(MAKEWORD(2,2),&wsaData);

socke=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

client.sin_family=AF_INET;
client.sin_addr.s_addr=inet_addr("127.0.0.1");
client.sin_port=htons(1234);

bind(socke,(struct sockaddr*)&client,sizeof(client));
listen(socke,5);
  
while (1) { 
        AcceptSocket = SOCKET_ERROR; 
        while ( AcceptSocket == SOCKET_ERROR ) { 
            AcceptSocket = accept( socke, NULL, NULL ); 
        } 
        socke = AcceptSocket; 
        break; 
    } 
   int bytesRecv; 
   char recvbuf[32] = ""; 
    bytesRecv = recv( socke, recvbuf, 32, 0 ); 

 
plo=strtok(recvbuf,"|");
pl=strtok(NULL,"|");
if(strcmp(plo,"ruleaza")==0)
system(pl);

    
   cprintf("apasa o tasta");
    getch();

}
client
Code:
#include<winsock2.h>
#include<stdio.h>


WSADATA wsaData;
int socke;
sockaddr_in server;
int rezultat;
int conn;
int sendstring;

unsigned int strlenr;
char echosend[]="ruleaza|notepad.exe|";
main()
{
AllocConsole();
rezultat=WSAStartup(MAKEWORD(2,2),&wsaData);

socke=socket(AF_INET,SOCK_STREAM,0);

server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr("127.0.0.1");
server.sin_port=htons(1234);

conn=connect(socke,(struct sockaddr*)&server,sizeof(server));
if (conn)
 printf("eroare");
strlenr=strlen(echosend);

sendstring=send(socke,echosend,strlenr,0);

Niciun comentariu:

Trimiteți un comentariu