Après TCP : UDP

Résolu
TheCamel Messages postés 26 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 23 février 2011 - 17 févr. 2009 à 18:59
TheCamel Messages postés 26 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 23 février 2011 - 19 févr. 2009 à 17:22
Bonjour à tous,

Après de longues années de programmation en C, et d'utilisation des sockets, je suis face à un problème : je dois développer deux programmes (un client et un serveur) qui communiquent entre-eux. La vitesse d'actualisation des données entre les deux programmes est de 4x par seconde. Jusque là pas de problème. Mais il se trouve que ma connexion en TCP est trop lente, et vu le taux d'actualisation, je peux me permettre de perdre un ou deux "paquets" de données et l'ordre des données ne n'importe pas. Je me suis donc essayé à l'UDP. Mais la mise en oeuvre ne m'a pas l'air la même et je n'y arrive pas .

Si vous pouviez m'expliquer comment mettre en oeuvre un serveur et un client en UDP.

Merci d'avance,
Benoît

4 réponses

SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011
19 févr. 2009 à 09:47
Salut,
alors voilà:
-------------------------------------------------------------------------- SERVEUR
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include

#define MSGSIZE 500

main(int argc, char **argv)
{
int sockfd, cc, addr_in_size;
u_short portnum = 12345;
struct sockaddr_in *my_addr, *from;
char *msg;
u_long fromaddr;

addr_in_size = sizeof(struct sockaddr_in);

msg = ( char *)malloc(MSGSIZE);
from = (struct sockaddr_in *)malloc(addr_in_size);
my_addr = ( struct sockaddr_in *)malloc(addr_in_size);

memset((char *)my_addr,(char)0,addr_in_size);
my_addr->sin_family = AF_INET;
my_addr->sin_addr.s_addr = htonl(INADDR_ANY);
my_addr->sin_port = portnum;

if ((sockfd = socket (PF_INET, SOCK_DGRAM, 0)) < 0){
fprintf(stderr,"Error %d in socket: %s\n",errno,sys_errlist[errno]);
exit(errno);
};

if(bind(sockfd, (struct sockaddr *)my_addr, addr_in_size) < 0){
fprintf(stderr,"Error %d in bind: %s\n",errno,sys_errlist[errno]);
if(errno != EADDRINUSE) exit(errno);
};

fprintf(stdout,"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);

}

}

------------------------------------------------------------------CLIENT

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include

#define MSGSIZE 500

main(int argc,char **argv)
{
int sockfd, ok, addr_in_size;
u_short portnum = 12345;
struct sockaddr_in *to;
struct hostent *toinfo;
char *msg, *htoname = "127.0.0.1";
u_long toaddr;

msg = ( 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);
};
toaddr = *(u_long *)toinfo->h_addr_list[0];

addr_in_size = sizeof (struct sockaddr_in);
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)) = -1){
fprintf(stderr,"Error %d in socket: %s\n",errno,sys_errlist[errno]);
exit(errno);
};

ok = 1;
while (ok){
fprintf(stdout,"Message: ");
scanf("%s",msg);
fprintf(stdout,"\n");
ok = (msg[0] != '0');

if (sendto(sockfd,msg,strlen(msg),0,(struct sockaddr *)to,
addr_in_size) == -1){
fprintf(stderr,"Error %d in sendto: %s\n",errno,sys_errlist[errno]);
exit(errno);
}
}
}

Cordialement,
Sébastien.
3
SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011
17 févr. 2009 à 22:27
Des longues année de fumisterie alors ..

Cordialement,
Sébastien.
0
TheCamel Messages postés 26 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 23 février 2011 1
18 févr. 2009 à 18:20
Je ne vois pas en quoi ne pas avoir besoin d'utiliser de protocole  UDP est de la fumisterie ...  le plus souvent on me chargeait de chats quand il fallait du réseau.
0
TheCamel Messages postés 26 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 23 février 2011 1
19 févr. 2009 à 17:22
Ah, merci beaucoup.
0
Rejoignez-nous