Probleme de RECVFROM pour un client

Probleme de RECVFROM pour un client - C - Programmation

Marsh Posté le 05-06-2008 à 21:56:50    

Bonjour,
 
Voilà j'ai codé une application client serveur et dans le sens client-->serveur tout va bien. Par contre dans l'autre sens impossible d'envoyer des données. Lorsque le client se connecte au serveur celui-ci me donne comme erreur: Error 22 in recvfrom: Invalid Argument Je me doute bien que j'ai mal codé quelque chose mais je ne vois pas quoi. Voici le code du client:
 
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <ctype.h>
#include <errno.h>
#include <arpa/inet.h>
 
#define MSGSIZE 500
#define max(a,b) //((a);(b)?(b);(a))
 
void fatalerror(char *info)
{
       perror(info);
       exit(-1);
}
 
int main(int argc,char *argv[])
{  
     int fd,i,j, sockfd, ok, addr_in_size, cc;
 double pid;
     char *send, *htoname = "127.0.0.1", *msg;
 struct sockaddr_in remote, *to, *from, *my_addr;
     struct hostent *host, *toinfo;
     struct servent *service;
     fd_set rfs;
     int nbsend, nbrecv;
   u_short portnum = 12345;
   u_long toaddr, fromaddr;
     
 if( (fd=socket(AF_INET,SOCK_STREAM,0)) <0)  
         fatalerror("socket" );
   
 if(argc !=2)
     {    
         fprintf(stderr,"usage: %s remote host\n",argv[0]);
         exit(-1);
     }
 
 if(isdigit(argv[1][0]))
     {
         char addr[4];
         if(sscanf(argv[1],"%d.%d.%d.%d",(int*)&(addr[0]),(int*)&(addr[1]),
             (int*)&(addr[2]),(int*)&(addr[3]))!=4)
         {
              fprintf(stderr,"%s est une adrese IP malformée\n",argv[1]);
              exit(-1);
         }
 
         if( (host=gethostbyaddr(addr,4,AF_INET))==NULL)          
         {
              herror("gethostbyaddr" );
              exit(-1);
         }
 }
 
 else
     {
         if( (host=gethostbyname(argv[1]))==NULL)
             {
                 herror("gethostbyname" );
                 exit(-1);
             }
     }
 
 if( (service=getservbyname("echo","tcp" ))==NULL)
  fatalerror("getservbyname" );
 
 addr_in_size = sizeof(struct sockaddr_in);
 
    remote.sin_family=AF_INET;
    remote.sin_port = ntohs(ntohs(service->s_port)+1024);
    memcpy(&remote.sin_addr,host->h_addr,host->h_length);
 if(connect(fd,(struct sockaddr*)&remote,sizeof(remote))<0)
  fatalerror("connect" );
 
 msg = (char *)malloc(MSGSIZE);
   from = (struct sockaddr_in *)malloc(addr_in_size);
 send = (char *)malloc(MSGSIZE);
   to = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in));
 
   if((toinfo = gethostbyname(htoname)) == NULL){
      fprintf(stderr,"Error %d in gethostbyname: %s\n",errno,sys_errlist[errno]);
     exit(errno);
   }
 my_addr = (struct sockaddr_in *)malloc(addr_in_size);  
   toaddr = *(u_long *)toinfo->h_addr_list[0];
 
   memset((char *)to,(char)0,addr_in_size);
 
   to->sin_family = AF_INET;
   to->sin_addr.s_addr = toaddr;
   to->sin_port = /*(htons)*/portnum;
 
   if((sockfd = socket (PF_INET, SOCK_DGRAM, 0)) < 0){
      fprintf(stderr,"Error %d in socket: %s\n",errno,sys_errlist[errno]);
      exit(errno);
   }  
 
   ok = 1;
 pid = fork();
 if(pid==0){
  printf("Ready to Receive\n" );
  while(1){
    if((cc = recvfrom (sockfd,msg,MSGSIZE,0,(struct sockaddr *)from,&addr_in_size)) == -1){
         fprintf(stderr,"Error %d in recvfrom: %s\n",errno,sys_errlist[errno]);
          exit(errno);
       };
       fromaddr = from->sin_addr.s_addr;
       msg[cc] = '\0';
       fprintf(stdout,"From %s port %d: %s\n",(gethostbyaddr((char *)&fromaddr,sizeof(fromaddr),AF_INET))->h_name,from->sin_port,msg);  
  }
 }

 if(pid==-1){
  printf("Echec Fork\n" );
 }
 else{
  printf("Pere ok\n" );
  while(ok){
       fprintf(stdout,"Message: \n" );
       scanf("%s",send);
       fprintf(stdout,"\n" );
       ok = (send[0] != '0');
   if(sendto(sockfd,send,strlen(send),0,(struct sockaddr *)to,addr_in_size) == -1){
          fprintf(stderr,"Error %d in sendto: %s\n",errno,sys_errlist[errno]);
         exit(errno);
   }
  }
 }
 shutdown(fd,2);
}
 
 
J'ai mis en gras ce qui ce rapporte au recvfrom si quelqu'un peut m'aider.
Merci par avance
Lars

Reply

Marsh Posté le 05-06-2008 à 21:56:50   

Reply

Sujets relatifs:

Leave a Replay

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