Jump to content
parazitul29

crearea unei aplicati client/server c++

Recommended Posts

Posted (edited)

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


#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


#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);

}

Edited by parazitul29
Posted

editeaza postul si foloseste tagul [\code] [/\code] (fara "\") pentru a putea aranja cum trebuie codul. Astfel codul ramane in forma in care a fost copiata din ide-ul tau.

Dragut tutorial. Il incerc cand ajung acasa :)

Posted

Cand incerc sa compilez server-ul si sa-l rulez imi, compiler-u imi returneaza urmatoarele erori:


Executing g++.exe...
g++.exe "C:\Documents and Settings\x\Desktop\parazitul29\server.cpp" -o "C:\Documents and Settings\x\Desktop\parazitul29\server.exe" -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib"
C:\Documents and Settings\x\Desktop\parazitul29\server.cpp: In function `int main()':
C:\Documents and Settings\x\Desktop\parazitul29\server.cpp:28: warning: converting of negative value `-0x000000001' to `SOCKET'
C:\Documents and Settings\x\Desktop\parazitul29\server.cpp:40: error: `plo' undeclared (first use this function)
C:\Documents and Settings\x\Desktop\parazitul29\server.cpp:40: error: (Each undeclared identifier is reported only once for each function it appears in.)
C:\Documents and Settings\x\Desktop\parazitul29\server.cpp:41: error: `pl' undeclared (first use this function)
C:\Documents and Settings\x\Desktop\parazitul29\server.cpp:46: error: `cprintf' undeclared (first use this function)

Execution terminated

Folosesc Dev-C++, voiam sa incerc sa ii fac un crash server-ului si anume facand buffer overflow (incercand, cel putin) astuia:


int bytesRecv;
[B]char recvbuf[32][/B] = "";//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

Nu stiu daca am dreptate, dar cum ziceam, am vrut sa incerc.

Oricum, multumesc pentru efort si informatii.

Posted

@flubber

greseala mea la alea cu plo cand am scris tutorialul am modificat niste variabile si am mai schimbat numele si astora(am modificat),am pus codurile sursa mie mi le compileaza perfect cu vc++ bine un warninguri ca nu am pus return 0;

Posted (edited)

cel mai probabil a folosit visual c++ 2006. De aia da erorile respective.

iata codul un pic mai aranjat fata de cum l-a postat parazitul. Cu intendurile de rigoare.

Din ce imi dau eu seama, foloseste o versiune destul de veche ce c++ si de aia erorile. In plus cred ca imi lipsesc mie niste dll-uri pe calculatorul de la servici. Vad acasa daca pot face ceva.

Din nou bravo cu tutorialul, cautam de mult ceva din care sa inteleg socks-urile mai bine :D

client

le1: l-am facut sa functioneze. Pentru a putea rula/compila, aveti nevoie sa legati libwsock32.a sau libwsock32.lib in functie de ce aveti voi(eu am code blocks 10.05 si a trebuit sa leg libwsock32.a) a compilat fara probleme. A avut 1-2 warninguri legate de faptul ca este declarat main fara nici un tip, si inca ceva dar nu mai tin minte ce anume.

Rulati serverul dupa care clientul. Serverul v-a va deschide notepad-ul si se v-a inchide.


#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

}

si serverul


#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


plo=strtok(recvbuf,"|");//impartim stringul in tokene folosind strtok
pl=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();

}

Edited by nedo

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...