begin process at 2010 02 10 11:31:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > FAIRE PASSER LE PARTAGE DE CONNEXION A SERTAIN SERVEUR (TCP ET UDP) (VC++)

FAIRE PASSER LE PARTAGE DE CONNEXION A SERTAIN SERVEUR (TCP ET UDP) (VC++)


 Information sur la source

Note :
Aucune note
Catégorie :Réseaux & Internet Classé sous :tcp, udp, socket Niveau :Débutant Date de création :26/02/2004 Date de mise à jour :29/11/2005 17:54:31 Vu / téléchargé :5 240 / 276

Auteur : petitchech

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 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

  • #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;
  • }
#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).

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

29 novembre 2005 17:54:31 :
.

 Sources du même auteur

Source avec Zip Source avec une capture RECUPERER LES INFOS D'UN SERVEUR HALF-LIFE ET C'EST MODS ET ...
Source avec Zip CRYPTEUR DE TEXTE ET FICHIER VC++

 Sources de la même categorie

Source avec Zip TIM_RESEAU, CLASSES POUR RESEAU COMPLET par williamallas
Source avec Zip INTERNET IP FINDER TROUVER VOS ADRESSE IP (INTERNET) par xmustapha
Source avec Zip CLIENT/SERVEUR AVEC TSOCKETSERVER & TCLIENTSOCKET par xmustapha
Source avec Zip REMOTE SHELL GEN par ganjarasta
PROXY IRC SIMPLE (WINDOWS/WINSOCK) par _michel

 Sources en rapport avec celle ci

Source avec Zip LIBCONNECT - BIBLIOTHÈQUE C++ DE CONNEXION par turnerom
Source avec Zip MINI CHAT CLIENT-SERVEUR (UDP) AVEC TRANSFERT DE FCIHIER (TC... par CAVAVIN128
Source avec Zip SQUELETTE DE COMMUNICATION PAR SOCKET EN MODE CONNECTÉ POUR ... par AlexN
Source avec Zip BIBLIOTHÈQUE PERMETTANT D'UTILISER LES SOCKETS DE MANIÈRE TR... par turnerom
Source avec Zip MK_SOCKET : UNE BIBLIOTHÈQUE COMPLÈTE ET TRÈS SIMPLE DE GEST... par dnob700

Commentaires et avis

Commentaire de BlackGoddess le 28/02/2004 02:52:02

vive l'orthographe ...

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

Commentaire de petitchech le 28/02/2004 10:31:44

Oui je sai l'orthographe c'est pas mon fort,
Je v changer les system("pause"); en getch(); avec un printf.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Socket TCP/UDP [ par hobbes ] Bonjour,j ai cru comprendre qu il existe 2 types de sockets (TCP et UDP) pouvant permettre l echange de donnees entre 2 applications sur le reseau.Pou Erreur 10049 sur socket UDP [ par Ezekiel69 ] Salut tous le monde...Me voici depuis plusieurs jour confronté un a problème étrange.Je veux envoyer un message par l'intermédiaire d'un packet UDP su Thread et socket udp [ par eurysthe ] Bonjour !!Voila j'ai un petit problème de thread qui me pourrit la vie.J'ai crée un thread qui doit écouter en boucle les informations qui transite su Problème de socket UDP sous linux [ par RaygKross ] Salut à tousMon problème est je dois créer un programme manager snmpLes port de SNMP sont 161 et 162J'initialise ma structure de type sockaddr_in avec Lire une reponse UDP dans une socket [ par topl ] bonjour,Je crée un petit prog qui envoi une requete à un serveur dns afin de resoudre le nom tel que "www.yahoo.com".Seulement lorsque je fais un rec Problème UDP [ par ToToL ] BonjoursJe me suis attaquer il y a peut de temps au socket UDP ( aparament plus rapide que le tcp ) et j'ai un petit souci : je n'arrive pas ds le mem socket tcp/ip en C [ par ravat485 ] qui peut m'aider par un exemple d'utilisation de socket en C (TCP/IP),pour envoyer des donnees??? recvfrom + udp + '\n' [ par vegetaline ] salutune appli client / serveur sous linux qui communique (enfin qui essaye) avec des sockets INTERNET en mode NON CONNECTE (en udp :)pb -&gt; le recv Raw Socket -> TCP/IP [ par krum ] Voila plus d'une semaine que je fouille/cherche sur les moteurs de recherches,les forums ..des sources,des tutos,des papers sur les raw sockets (sous Problème fermeture socket [ par alexixlebaulois ] Salut,Je suis en train de créer une appli qui communique avec plusieurs serveurs pour récupérer leur état. Toutes les communications se font en même t


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,842 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales