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

Soyez le premier à donner votre avis sur cette source.

Vue 7 790 fois - Téléchargée 408 fois

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

Ajouter un commentaire

Commentaires

Messages postés
114
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
28 juin 2004

Oui je sai l'orthographe c'est pas mon fort,
Je v changer les system("pause"); en getch(); avec un printf.
Messages postés
338
Date d'inscription
jeudi 22 août 2002
Statut
Membre
Dernière intervention
14 juin 2005

vive l'orthographe ...

l'utilisation de system est déconseillé.
il faut préférer getch(); à system("pause"); par exemple

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.