Probleme de RECVFROM pour un client - C - Programmation
MarshPosté 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:
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); }
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