Faire passer le partage de connexion a sertain serveur (tcp et udp) (vc++)

Description

Permet à sertain serveur (vnc) de passer le partage de connexion.
Permet aussi d'analyser se qui s'echange entre le serveur et le client pour comprendre comment sertaine connexion fonctionne.

Source / Exemple :


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

SOCKET Sserv;
SOCKET Sclient;
SOCKET Satt;

fd_set Ref;
fd_set Test;

SOCKADDR_IN sockaddrserv;
SOCKADDR_IN sockaddrclient;

char req_host[255];
char buffer2[5000];
char temp[1024];
char *ip;
char buffer[5000];

struct hostent *host;
struct in_addr **a;

#pragma comment(lib,"ws2_32.lib")

int sockaddrclientsize = sizeof (struct sockaddr_in);
int clientmsgsize;
int test;
int port;
int port_server;
bool tcp;

DWORD WINAPI    recv_C (void*);
unsigned long Theard_C;

void main(int argc, char* argv[])
{
	if(argc != 5)
	{
		printf("- Quelle protocole voulez vous utiliser (udp - tcp)\n");
		cin.getline(temp,1024);
		if(!strcmp(temp,"tcp"))
		{
			tcp = true;
		}
		else
		{
			if(!strcmp(temp,"udp"))
			{
				tcp = false;
			}
			else
			{
				printf("- Type inconnue (%s)\n",temp);
				printf("Appuyez sur une touche pour continuer...");
				getch();
				return;
			}
		}

		printf("- Entre l'host du serveur a se connecte\n");
		cin.getline(req_host,255);

		printf("- Entre le port du serveur a se connecte\n");
		scanf("%d",&port);

		printf("- Entre le port a cree sur ce pc\n");
		scanf("%d",&port_server);
	}
	else
	{
		if(!strcmp(argv[1],"tcp"))
		{
			tcp = true;
		}
		else
		{
			if(!strcmp(argv[1],"udp"))
			{
				tcp = false;
			}
			else
			{
				printf("- Type inconnue (%s)\n",argv[1]);
				printf("Appuyez sur une touche pour continuer...");
				getch();
				return;
			}
		}
		strcpy(req_host,argv[2]);
		port = atoi(argv[3]);
		port_server = atoi(argv[4]);
	}

	WSADATA wsa;
	WSAStartup(MAKEWORD(2,0),&wsa);

    if(host = gethostbyname(req_host))
	{ 
        for (a=(struct in_addr **)host->h_addr_list; *a; a++) 
		{
			ip = inet_ntoa(**a);
        }
    }

	printf("** Attente du client pour se connecte au serveur (%s) sur le port (%d)\n\n",ip,port);

	sockaddrserv.sin_family=AF_INET;
	sockaddrserv.sin_addr.s_addr=INADDR_ANY;
	sockaddrserv.sin_port=htons(port_server);

	FD_ZERO(&Ref);
	FD_ZERO(&Test);

	if(tcp == true)
	{
		Sserv = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	}
	else
	{
		Sserv = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
	}
	bind(Sserv,(SOCKADDR*)&sockaddrserv,sizeof(sockaddrserv));

	if(tcp == true)
	{
		listen(Sserv,0);

		FD_SET(Sserv,&Ref);
		Test = Ref;

		for(;;)
		{
			select(0,&Test,NULL,NULL,NULL);

			if(FD_ISSET(Sserv,&Test))
			{
				Satt = accept(Sserv,(struct sockaddr *)&sockaddrclient,&sockaddrclientsize);
				FD_SET(Satt,&Ref);

				printf("Client connecte\n");
				printf("** Connexion du programme a %s sur le port %d\n",ip,port);

				sockaddrclient.sin_family=AF_INET;
				sockaddrclient.sin_addr.s_addr=inet_addr(ip);
				sockaddrclient.sin_port=htons(port);

				Sclient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

				if(connect(Sclient,(SOCKADDR*)&sockaddrclient,sizeof(sockaddrclient)))
				{
					printf("La connection a echoue\n");
					printf("Appuyez sur une touche pour continuer...");
					getch();
					return;
				}
				else
				{
					printf("La connection au serveur %s sur le port %d a reussi\n",ip,port);
					CreateThread(NULL,0,&recv_C,NULL,NULL,&Theard_C);
				}	
			}
			else
			{
				clientmsgsize = recv(Test.fd_array[0],buffer,sizeof(buffer),0);
				if(clientmsgsize <= 0)
				{
					closesocket(Test.fd_array[0]);
					FD_CLR(Test.fd_array[0],&Ref);
					closesocket(Sclient);
					printf("Appuyez sur une touche pour continuer...");
					getch();
					return;
				}
				send(Sclient,buffer,clientmsgsize,0); 
			}
			Test = Ref ;
		}
	}
	else
	{
		sockaddrclient.sin_family=AF_INET;
		sockaddrclient.sin_addr.s_addr=inet_addr(ip);
		sockaddrclient.sin_port=htons(port);

		Sclient=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
		CreateThread(NULL,0,&recv_C,NULL,NULL,&Theard_C);

		int sockaddrservsize=sizeof(sockaddrserv);
		for(;;)
		{
			clientmsgsize = recvfrom(Sserv,buffer,sizeof(buffer),0,(SOCKADDR*)&sockaddrserv,&sockaddrservsize);
			sendto(Sclient,buffer,clientmsgsize,0,(SOCKADDR*)&sockaddrclient,sizeof(sockaddrclient));
		}
	}
}

DWORD WINAPI    recv_C (void*)
{     
	Sleep(500);
	if(tcp == true)
	{
		for(;;)
		{
			test = recv(Sclient,buffer2,sizeof(buffer2),0);
			if(test <= 0)
			{
				printf("\nConnexion perdu avec le serveur\n");
				FD_CLR(Satt,&Ref);
				closesocket(Satt);
				printf("Appuyez sur une touche pour continuer...");
				getch();
				exit(0);
			}
			send(Satt,buffer2,test,0);
		}
	}
	else
	{
		int sockaddrclientsize=sizeof(sockaddrclient);
		for(;;)
		{
			memset(buffer2,0,sizeof(buffer2));
			test  = recvfrom(Sclient,buffer2,sizeof(buffer2),0,(SOCKADDR*)&sockaddrclient,&sockaddrclientsize);
			sendto(Sserv,buffer2,test,0,(SOCKADDR*)&sockaddrserv,sizeof(sockaddrserv));
		}
	}
	return TRUE;
}

Conclusion :


On execute le programme sur le pc qui a la connexion internet, il attend la connexion d'un client sur le port configuré pour se connecté au serveur configuré (sur un pc du reseau local).

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.