Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1207 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Script pour envoi de fichier par socket

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Script pour envoi de fichier par socket

n°1496324
DrOctopus
Posté le 27-12-2006 à 14:04:49  profilanswer
 

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);
}
 
 
}

mood
Publicité
Posté le 27-12-2006 à 14:04:49  profilanswer
 

n°1496342
Dumbledore
Posté le 27-12-2006 à 14:55:19  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Script pour envoi de fichier par socket

 

Sujets relatifs
PERL : script appelé par 1 autre ne fonctionne pas alors que seul ouiScript pour gestion de cours par catégories
Modifier un fichier[Resolu] Comment lire dans un fichier ligne par ligne
comment tricher dans un FORM grace au PHP ??? envoi d'une valeur ?Cherche script pour ftp
Importer fichier vers serveur[PHP] nombre d'octets de fichier ouvert avec file_get_contents
comment faire un appel à un fichier depuis run??[ASP.NET] chemin complet d'un fichier ( FileUpload )
Plus de sujets relatifs à : Script pour envoi de fichier par socket


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR