mercredi 1 décembre 2010 à 10:27:15 |
Re : socket

sarlissa
|
bonjour, je travaile sur un programme de socket qui réalise le transfert de fichier:
-L'utilisateur se conecte au serveur en mode non conecté pour choisir le mode de transfert s'il veut continuer en mode non conecté le transfert s'efectue sinon il se deconecte pour reconecter en mode conecter et puis reçevoir le fichier.
-Le serveur gère 5 utilisateurs a la fois avec la fonction fork.
en fait mon problème et comme suite:
dabord dans quand j'execute mon code et je choisie le mode conécté on me donne une erreur de conection,et quand je choisie le mode non conecté le transfert nesetermine jamais.et pourtant les deux programe conecté et non conécté s'exécute a la perfection quant ils sont isolé.
si quelqu'un pourais m'aider je serais très reconnaisante.
voici mon code:
serveur:
Code C/C++ : //COD C SERVEUR DANS DOMAINE INTERNET
#include<stdio.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include <sys/wait.h>
#include <stdlib.h>
void conecte(char**);
//*****************variables globales:
int sockfd,newsockfd,clilen,max=250;
static struct sockaddr_in loc_addr, cli_addr;
char recvline[256]="",fichier[20],mode;
FILE *fich2;
main(int argc, char * argv[])
{//pid_t pid;
int i=1,etat,ret_fils,pid;
for(i=1;i<=5;i++)
{
pid=fork();
if(pid==0)
{ printf
("\t\t\t\t********\n\t\t\t\t* FILS * \n\t\t\t\t********\n");
loc_addr.sin_family=AF_INET;
loc_addr.sin_addr.s_addr=htonl(INADDR_ANY);
loc_addr.sin_port=htons(atoi(argv[1]));//ou htons(NUMPORT)
clilen=sizeof(cli_addr);
//************************************
//*********************mode non conecté
{
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
printf("error socket\n");
else{
printf("le numéro de port est %s\n",argv[1]);
unlink(sockfd);
if(bind(sockfd,(struct sockaddr *)&loc_addr,sizeof(loc_addr))<0)
perror("bind");
else{
clilen=sizeof(cli_addr);
recvfrom(sockfd,&mode,1,0,(struct sockaddr *)&cli_addr,&clilen);
//**************************si l'utilisateur souhaite rester en mode non conecté:
if(mode!='g' && mode!='G')
{recvfrom(sockfd,&mode,1,0,(struct sockaddr *)&cli_addr,&clilen);
//*******************************************************
recvfrom(sockfd,fichier,sizeof(fichier),0,(struct sockaddr *)&cli_addr,&clilen);
if(fich2=fopen(fichier,"r+"))printf("ouverture de fichier reussi\n");
else printf("erreur ouvertur fichier\n");
printf("debut de transfert de fichier ...\n");
//*******************************************************
//*****************fichier texte:
if(mode=='t' || mode=='T')
{
do{
fgets(recvline,256,fich2);
sendto(sockfd,recvline,sizeof(recvline),0,(struct sockaddr *)&cli_addr,clilen);
}while(!feof(fich2));// && !ferror(fich2));
sendto(sockfd,"FIN",sizeof("FIN"),0,(struct sockaddr *)&cli_addr,clilen);
printf("fin de transfert\n");
}
//******************fichier binaire
else
{
do{
fread(recvline,256,1,fich2);
sendto(sockfd,recvline,sizeof(recvline),0,(struct sockaddr *)&cli_addr,clilen);
}while(!feof(fich2) && !ferror(fich2));
sendto(sockfd,"FIN",sizeof("FIN"),0,(struct sockaddr *)&cli_addr,clilen);
printf("fin de transfert\n");
}
//************fin fichier binaire
fclose(fich2);
close(newsockfd);
}
}
}
if(mode=='s' || mode=='S')
conecte(argv);
}
i++;}
else if(pid==-1){printf ("Le fork a echoue");
exit(2);}
}
printf("********\n* PERE *\n********\n");
ret_fils = wait (&etat);
}
//***********************si l'utilisateur souhaite le mode conecté:
void conecte(char **argv)
{
loc_addr.sin_family=AF_INET;
loc_addr.sin_addr.s_addr=htonl(INADDR_ANY);
loc_addr.sin_port=htons(3333);//ou htons(atoi(argv[1]));
clilen=sizeof(cli_addr);
//************************************
close(sockfd);//fermeture du mode non conecté
//***********création de socket
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
printf("error socket\n");
unlink(sockfd);
if(bind(sockfd,(struct sockaddr *)&loc_addr,sizeof(loc_addr))<0)
perror("bind");
else{
listen(sockfd,5);
newsockfd=accept(sockfd,(struct sockaddr *)&cli_addr,&clilen);
if (newsockfd<0) {printf("accept error\n");}
else{
printf("connection acceptee\n");
//*******************************************************
read(newsockfd,fichier,20);
if(fich2=fopen(fichier,"r+"))printf("ouverture de fichier reussi\n");
else printf("erreur ouvertur fichier\n");
printf("debut de transfert de fichier ...\n");
//*******************************************************
//*****************fichier texte:
if(mode=='t' || mode=='T')
{
do{
fgets(recvline,256,fich2);
write(newsockfd,recvline,sizeof(recvline));
}while(!feof(fich2));
write(newsockfd,"FIN",sizeof("FIN"));
fclose(fich2);
}
//******************fichier binaire:
else
{
do{
fread(recvline,256,1,fich2);
write(newsockfd,recvline,sizeof(recvline));
}while(!feof(fich2) && !ferror(fich2));
write(newsockfd,"FIN",sizeof("FIN"));
printf("fin de transfert\n");
}
fclose(fich2);
close(newsockfd);
}
}
}
client:
Code C/C++ : //COD C CLIENT DANS DOMAINE INTERNET
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include<stdio.h>
#include<string.h>
void conecte(char**);
//************************variable globales:
int sockfd,servlen,b=1;
FILE *fich1;
struct sockaddr_in serv_addr;
char sendline[256]="",fichier[20],fichier1[20],c,mode;
//****************************************
main(int argc,char** argv)
{
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(argv[2]);//ou inet_addr(" 127.0.0.1")
serv_addr.sin_port=htons(atoi(argv[1]));
//*********************mode non conecté:
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
printf("erreur creation de socket\n");
else{
servlen=sizeof(serv_addr);
do{printf("si vous voulez transferer en mode conecté taper \"s\";si non taper \"g\":");
scanf("%c",&mode);
}while(mode!='S' && mode!='s' && mode!='G' && mode!='g');
write(sockfd,mode,sizeof(mode));
sendto(sockfd,&mode,sizeof(mode),0,(struct sockaddr *)&serv_addr,servlen);
//**************************si l'utilisateur souhaite rester en mode non conecté:
if(mode=='g' || mode=='G')
{do{printf("si c'est un fichier texte taper \"t\";si non taper \"b\":");//choix du type de fichier à reçevoir
scanf("%c",&mode);
}while(mode!='t' && mode!='T' && mode!='b' && mode!='B');
sendto(sockfd,&mode,sizeof(mode),0,(struct sockaddr *)&serv_addr,servlen);//l'envois du type au serveur
//*******************************************************
printf("entrer le nom du fichier pour ecriture:");
scanf("%s",fichier1);
if(fich1=fopen(fichier1,"a+"))printf("ouverture de fichier reussi\n");
else printf("erreur ouvertur fichier\n");
printf("entrer le nom du fichier a recharger:");
scanf("%s",fichier);
sendto(sockfd,fichier,sizeof(fichier),0,(struct sockaddr *)&serv_addr,servlen);
printf("debut de reception de fichier ...\n");
//*******************************************************
//*****************fichier texte:
if(mode=='t' || mode=='T')
{ recvfrom(sockfd,sendline,sizeof(sendline),0,(struct sockaddr *)&serv_addr,&servlen);
while(strcmp(sendline,"FIN")){
fputs(sendline,fich1);
recvfrom(sockfd,sendline,sizeof(sendline),0,(struct sockaddr *)&serv_addr,&servlen);
}
}
//******************fichier binaire:
else
{ recvfrom(sockfd,sendline,256,0,(struct sockaddr *)&serv_addr,&servlen);
while(strcmp(sendline,"FIN")){
fwrite(sendline,256,1,fich1);
recvfrom(sockfd,sendline,sizeof(sendline),0,(struct sockaddr *)&serv_addr,&servlen);
}
}
fclose(fich1);
printf("fin de reception\n");
}
close(sockfd);
}
if(mode=='s' || mode=='S') conecte(argv);
close(sockfd);
//else printf("option inconue!");
}
//***********************si l'utilisateur souhaite le mode conecté:
void conecte(char **argv)
{
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(argv[2]);//ou inet_addr(" 127.0.0.1")
serv_addr.sin_port=htons(3333);//htons(atoi(argv[1]));
close(sockfd);//fermeture du mode non conecté
//**************reconection en mode conecté:
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
printf("erreur creation de socket\n");
else{
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
printf("error connexion\n");
else{ do{printf("si c'est un fichier texte taper \"t\";si non taper \"b\":");
scanf("%c",&mode);
}while(mode!='b' && mode!='t' && mode!='T' && mode!='B');
write(sockfd,mode,sizeof(mode));
//*******************************************************
printf("entrer le nom du fichier pour ecriture:");
scanf("%s",fichier1);
printf("entrer le nom du fichier a recharger:");
scanf("%s",fichier);
write(sockfd,fichier,sizeof(fichier));
if(fich1=fopen(fichier1,"a+"))printf("ouverture de fichier reussi\n");
else printf("erreur ouvertur fichier\n");
printf("debut de reception de fichier ...\n");
//*******************************************************
//*****************fichier texte:
if(mode=='t' || mode=='T')
{
read(sockfd,sendline,sizeof(sendline));
while(strcmp("FIN",sendline)!=0){
fputs(sendline,fich1);
read(sockfd,sendline,sizeof(sendline));
}
}
//******************fichier binaire:
else
{ read(sockfd,sendline,sizeof(sendline));
while(strcmp(sendline,"FIN")){
fwrite(sendline,sizeof(sendline),1,fich1);
read(sockfd,sendline,sizeof(sendline));
}
}
fclose(fich1);
printf("fin de reception\n");
}
}
close(sockfd);
}
 note:le programme est sous linux
et merci d'avance
|
|