parazitul29 Posted October 1, 2010 Report Posted October 1, 2010 (edited) crearea unei aplicati client/server in c++ 1.socketsun 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 clientulclientul 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. serverla 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 strtokmain(){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 bitilisten(socke,5);//setam serverul sa astepte conexiuni pe acel socket, listen ia 2 parametri socketul si numarul maxim de conexiuni eu am pus 5while (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 strtoktokenul2=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 October 2, 2010 by parazitul29 Quote
nedo Posted October 2, 2010 Report Posted October 2, 2010 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 Quote
sharkyz Posted October 2, 2010 Report Posted October 2, 2010 Te cam incurci cand il citesti fara tagul cod dar este chiar foarte frumos tutorialul si chiar in momentul in care imi trebuia. Quote
Flubber Posted October 2, 2010 Report Posted October 2, 2010 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 terminatedFolosesc 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 datelebytesRecv = 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. Quote
parazitul29 Posted October 2, 2010 Author Report Posted October 2, 2010 @flubbergreseala 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; Quote
nedo Posted October 2, 2010 Report Posted October 2, 2010 (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 clientle1: 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 nostrusockaddr_in server;// structura sockaddr_inint conn;// conexiuneaint sendstring;//functia de trimitereunsigned int strlenr;//lungimea stringului care urmeaza a fi trimischar echosend[]="ruleaza|notepad.exe|";//stringul care va fi trimismain(){ 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 strtokchar *tokenul2;//pointer pentru functia strtokmain(){ 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 October 2, 2010 by nedo Quote