Script pour envoi de fichier par socket

Script pour envoi de fichier par socket - C++ - Programmation

Marsh Posté le 27-12-2006 à 14:04:49    

Bonjour,
après pas mal de recherche sur le net, je ne trouve rien sur l´envoi de fichier par socket. Pour l´instant j´ai 2 scripts ,1 coté serveur et l´autre coté client, et je peux simplement envoyer des messages du client vers le serveur.
Pourriez vous m´aider svp ? mes connaissances en socket sont assez limités, ce sont des scripts déja faits ...
 
Pour ceux que cela intéresse:
 
CLIENT:
#include <stdio.h>      /* E/S standard: gets, printf, etc.                
#include <string.h>     /* strlen etc. , memcpy                          
#include <sys/types.h>  /* Divers designateurs de type                    
#include <sys/socket.h> /* Sockets en general                              
#include <netinet/in.h> /* Sockets du domaine Internet                  
#include <netdb.h>      /* hostent, gethostbyname, gethostbyaddr          
/**************************************************************************/
#define nomhoteserveur "PC_Distant"
#define portserveur 11111
struct sockaddr_in adrserveur; /* Adresse du serveur */
struct sockaddr_in adrclient; /* Adresse du client */
int s; /* Numero socket */
char message[100]; /* Tampon Donnees niveau application */
struct hostent *h;
 
/*************************************************
*************************/
 
void main()
{
 
/******************** CREATION DE LA SOCKET *****************************/
if ( (s=socket(AF_INET,SOCK_STREAM,6)) == -1) /* 6 = numero protocole TCP*/
{ printf(">>> %s\n\n" , "Creation socket impossible" );
exit(1);
}
 
/************** INITIALISATION DE L´ADRESSE DU SERVEUR ***************/
adrserveur.sin_family = AF_INET;
if ( (h=gethostbyname(nomhoteserveur)) == NULL )
{ printf("\n>>> %s\n\n" , "Nom hote serveur inconnu" );
exit(1);
}
memcpy ( &adrserveur.sin_addr , h->h_addr , h->h_length );
adrserveur.sin_port = portserveur;
 
/******** DEMANDE DE CONNEXION ********************************************/
if (connect(s,(struct sockaddr*) &adrserveur,sizeof(adrserveur)) == -1)
{ printf("\n>>> %s\n\n" , "Connexion au serveur impossible" );
exit(1);
}
 
/******** EMISSION DU MESSAGE (bind automatique) ************************/
while (1) /* Boucle sans fin, arret par control-C */
{
 
printf("|Message: " );
gets(message); /* lit une ligne, scanf ne lit qu´un mot */
if (write(s,message,strlen(message)+1) == -1)
{ printf("\n>>> %s\n\n" , "Emission du message impossible" );
exit(1);
}
}
 
 
exit(0);
}
 
 
 
SERVEUR:
 
/**************************************************************************/
/* Fichiers include <....>: consultables par pg ou cat dans /usr/include  */
#include <stdio.h>      /* E/S standard: gets, printf, etc.               */
#include <string.h>     /* strlen etc. , memcpy                           */
#include <sys/types.h>  /* Divers designateurs de type                    */
#include <sys/socket.h> /* Sockets en general                             */
#include <netinet/in.h> /* Sockets du domaine Internet                    */
#include <netdb.h>      /* hostent, gethostbyname, gethostbyaddr  
/**************************************************************************/
#define portserveur 11111
struct sockaddr_in adrserveur; /* Adresse serveur */
struct sockaddr_in adrclient; /* Adresse client */
int lgadrclient = sizeof(adrclient);
int s; /* Numero socket */
int cli_sock; /* Numero socket client */
int n; /* Nombre de caracteres lus */
char message[100]; /* Tampon reception niveau application*/
struct hostent *h;
 
/*************************************************
*************************/
void main ()
{
/*********************** CREATION DE LA SOCKET D´IDENTIFIANT s **********/
if ( (s=socket(AF_INET,SOCK_STREAM,6)) == -1 )
{ printf("\n>>> %s\n\n" , "Creation socket impossible" );
exit(1);
}
/*********** LIEN DE LA SOCKET s A L´ADRESSE DU SERVEUR ******************/
adrserveur.sin_family = AF_INET;
adrserveur.sin_addr.s_addr = 0; /* 0.0.0.0 <---> adresse locale */
adrserveur.sin_port = portserveur;
if ( bind(s,(struct sockaddr*) &adrserveur,sizeof(adrserveur)) == -1 )
{ printf("\n>>> %s\n\n" , "Lien de la socket a l´adresse impossible" );
exit(1);
}
 
/******** PASSAGE DE LA SOCKET EN ECOUTE PASSIVE *************************/
printf("Attente de connexion \n" );
/*pause(2);*/
listen(s,10);
 
/******** ACCEPTATION DE CONNEXION ***************************************/
lgadrclient = sizeof(adrclient);
cli_sock = accept(s,(struct sockaddr*) &adrclient,&lgadrclient);
printf("Connexion etablie par le client:\n" );
 
if ( (h=gethostbyaddr((char *) &adrclient.sin_addr.s_addr,
sizeof(adrclient.sin_addr.s_addr),AF_INET)) == NULL)
{ printf("\n>>> %s\n\n" , "Nom hote client inconnu" );
exit(1);
}
printf("|| %s %d\n" , h->h_name , adrclient.sin_port );
 
/******** RECEPTION ET AFFICHAGE DES MESSAGES *************** ***********/
 
while (1)
{
n = read(cli_sock,message,sizeof(message));
if ( n == -1 )
{ printf("\n>>> %s\n\n" , "Lecture du message impossible" );
exit(1);
}
 
printf("|| Client: %s %d\n" , h->h_name , adrclient.sin_port );
printf("|| message: %s\n\n" , message);
}
 
 
}

Reply

Marsh Posté le 27-12-2006 à 14:04:49   

Reply

Marsh Posté le 27-12-2006 à 14:55:19    

C'est du C ton prog, pas du C++
 
Ensuite, pour envoyer un fichier, suffit de faire une lecture du fichier ligne par ligne (on va simplifier en disant que c'est un fichier texte hein !) Tu place chaque ligne dans un buffer et tu envoie le contenu du buffer. C'est tout.
 
EDIT : l'appel système correct pour envoyer des messages sur le réseau est send et non pas write.
Ensuite, c'est pas bien de mettre des numéros en dur pour les protocoles. D'après la doc de l'API socket, tu peux mettre soit "0" et dans ce cas, il se débrouille pour utiliser un protocole de flux associé à IPv4 (y en a pas 36, y a que TCP), soit tu utilise la fonction "getprotobyname" et les structures associées.
if ( (s=socket(AF_INET,SOCK_STREAM,6)) == -1)


Message édité par Dumbledore le 27-12-2006 à 15:01:08
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed