#1 Le 07/08/2008, à 11:07
- dva2tlse
[RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
Bonjour,
je débute dans la programmation en C avec les sockets, et dans un ridicule exemple de serveur, la fonction bind ne se passe pas bien donc je voudrais contrôler ce que valent les termes de la struct sockaddr qui lui est passée en argument.
Je vous mets le code ci dessous si jamais quelqu'un peut m'expliquer pourquoi ça plante dans le bind.
/* ceci est un essai pour comprendre ce qui se passe avec le net */
/* gcc snd.c -o snd */
/* mysocket = socket(int socket_family, int socket_type, int protocol); */
/* The protocol modules are grouped into protocol families like PF_INET, PF_IPX, PF_PACKET and socket types like SOCK_STREAM or SOCK_DGRAM */
/* socket(2) creates a socket, connect(2) connects a socket to a remote socket address, the bind(2) function binds a socket to a local socket address, listen(2) tells the socket that new connections shall be accepted, and accept(2) is used to get a new socket with a new incoming connection. */
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#define MAXNOM 32
void renvoi(int s) ;
/* programme serveur */
main(argc,argv)
int argc ;
char *argv[] ;
{
int sd,lacc, nsd ;
struct sockaddr_in adsock, adacc; /* struc adresse internet */
struct hostent *hptr ; /* infos recuperes sur le host */
struct servent *sptr ; /* infos recuperes sur le service */
char machine[MAXNOM+1] ; /* nom de la machine locale */
char *prog ; /*nom de ce programme */
char *mesg ;
prog = argv[0] ;
/* prendre les infos sur le service */
/* struct servent *getservbyname(const char *name, const char *proto); */
if((sptr = getservbyname("ftp","tcp")) == NULL ) {
printf("probleme : service inconnu\n") ;
exit(1) ;
}
/* recuperer le nom de la machine locale */
gethostname(machine,MAXNOM) ;
/* DVA le 7/08/2008: */
printf("\nmachine=%s\n",machine);
/* prendre les infos sur la machine locale */
if((hptr = gethostbyname(machine)) == NULL) {
printf("probleme : host inconnu\n") ;
exit(1) ;
}
bzero((char*)&adsock, sizeof(adsock));
/*initialiser la struct adsock avec les infos recuperes */
bcopy((char *)&hptr->h_addr,(char*)&adsock.sin_addr,hptr->h_length) ;
adsock.sin_family = AF_INET ;
/* recupere le numero du port */
adsock.sin_port = sptr->s_port ;
adsock.sin_addr.s_addr = INADDR_ANY ;
/* creer maintenant un socket */
if((sd = socket(AF_INET,SOCK_STREAM,0))<0) {
printf("probleme lors de la creation de socket \n") ;
exit(1) ;
}
/* DVA le 7/08/2008: */
printf("socket Ok; sd=%d\n",sd);
/* on va faire un bind sur le socket */
/* mais avant y faudrait contrôler la sockaddr */
/* int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); */
if(bind(sd,(struct sockaddr *) &adsock ,sizeof(adsock) ) == -1 ) {
printf("problème avec le bind\n") ;
exit(1) ;
}
/* initialiser la queue d'écoute */
listen(sd,5) ; /* backlog = 5 */
/* bouble d'attente de nouvelles connexions */
for(;;){
lacc = sizeof(adacc) ;
/* boucle d'accept */
if((nsd = accept(sd, ( struct sockaddr * ) &adacc, &lacc)) < 0 )
{
/* adacc -> infos du client */
printf("erreur sur l'accept \n") ;
exit(1) ;
}
renvoi(nsd) ;
close(nsd);
}
}
/* fonction renvoi */
void renvoi(s)
int s ;
{
char buf[256];
char *fichier;
char f[20];
char *mesgptr;
char mesg[250];
int l, c;
FILE *fp ;
char line[250] ={0} ;
char *lineptr = NULL;
/* lire une requete */
if((l=read(s, buf, sizeof(buf))) <= 0)
return ;
buf[l] = '\0' ; /*fin de chaine */
fichier=f;
if (!strcmp(buf,"lion")) fichier = "lion" ;
if (!strcmp(buf,"cancer")) fichier = "cancer" ;
if (!strcmp(buf,"scorpion")) fichier = "scorpion" ;
if (!strcmp(buf,"taureau")) fichier = "taureau" ;
if (!strcmp(buf,"vierge")) fichier = "vierge" ;
if (!strcmp(buf,"poisson")) fichier = "poisson" ;
if (!strcmp(buf,"capricorne")) fichier = "capricorne" ;
if (!strcmp(buf,"balance")) fichier = "balance" ;
if (!strcmp(buf,"belier")) fichier = "belier" ;
if (!strcmp(buf,"verseau")) fichier = "verseau" ;
if (!strcmp(buf,"gemeaux")) fichier = "gemeaux" ;
if((fp=fopen(fichier,"r"))==NULL) {
printf("erreur lors de l'ouverture du fichier\n");}
while(fgets(line,240,fp)){
write(s, line, strlen(line)) ;
}
return ;
}
/* fin */
Et voici le résultat des courses :
david@david-desktop:~/Snet$ gcc snd.c -o snd
david@david-desktop:~/Snet$ ./snd
machine=david-desktop
socket Ok; sd=3
problème avec le bind
david@david-desktop:~/Snet$
merci d'y avoir jeté un oeil,
David
Dernière modification par dva2tlse (Le 07/08/2008, à 16:00)
xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.
Hors ligne
#2 Le 07/08/2008, à 12:10
- Benni
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
Salut, remplace
printf("problème avec le bind\n")
par
perror("bind");
Ca te permettra déjà de voir pourquoi le bind ne passe pas
Hors ligne
#3 Le 07/08/2008, à 12:50
- dva2tlse
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
Ok merci super; je vais voir ça de ce pas (et je n'ai même plus besoin de repasser par windows pour le faire car depuis peu mon net marche sous linux, YOUPI)
David
ça me répond ça :
david@david-desktop:~/Snet$ gcc snd.c -o snd
david@david-desktop:~/Snet$ ./snd
machine=david-desktop
socket Ok; sd=3
bind: Permission denied
problème avec le bind
david@david-desktop:~/Snet$
donc je vais essayer de le passer en sudo, mais à quoi n'aurait il pas le droit d'accéder ? Certains ports ont ils un propriétaire exotique ou quoi d'autre ?
David
en effet; ça a l'air de marcher mieux, mais il doit maitenant être dans la boucle infinie d'attente d'une connexion; donc je n'ai plus qu'à essayer de faire marcher la partie client pour voir si ils arrivent à se causer...
David
Dernière modification par dva2tlse (Le 07/08/2008, à 13:03)
xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.
Hors ligne
#4 Le 07/08/2008, à 13:10
- nicolas.sitbon
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
Hors ligne
#5 Le 07/08/2008, à 13:34
- dva2tlse
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
mais ce qu'il se passe maintenant qu'il est bel et bien dans la boucle d'attente d'une connexion, (j'ai mis un printf dans la boucle en question pour savoir où il en était) ... donc ce qui se passe est que mon petit programme client n'arrive pas à obtenir d'infos sur le serveur.
Voici le code du client :
/* ceci est un essai pour comprendre ce qui se passe avec le net */
/* programme client */
/* gcc rcv.c -o rcv */
/* ./rcv david-desktop mai */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
main(argc,argv)
int argc ;
char *argv[] ;
{
int sd,lon ;
struct sockaddr_in adsock;
struct hostent *hptr ; /* infos recuperes sur le host */
struct servent *sptr ; /* infos recuperes sur le service */
char buf[256] ; /*buffer de lecture des infos */
char *prog ; /*nom de ce programme */
char *host ; /*pointeur sur le nom du host distant */
char *mesg ;
char *resg ; /*pointeur sur l'utilisateur distant */
prog = argv[0] ;
/* verification du nombre d'arguments de la ligne de commande */
if (argc != 3) {
printf("il faut trois arguments\n") ;
exit(1) ;
}
host = argv[1] ;
mesg = argv[2] ;
/* prendre les infos sur le host */
/* DVA le 7/08/2008: */
printf("host=%s\n",host);
if((hptr = gethostbyname(host)) == NULL) {
perror("gethostbyname");
printf("probleme d'infos sur le host \n") ;
exit(1) ;
}
/* initialiser la struct adsock avec les infos recuperes */
/* c a d l'adresse du host et le domaine internet */
bcopy((char *)hptr->h_addr,(char*)&adsock.sin_addr,hptr->h_length) ;
adsock.sin_family = hptr->h_addrtype ;
/* prendre les infos sur le service */
if((sptr = getservbyname("2223","tcp")) == NULL ) {
printf("probleme d'infos sur le service \n") ;
exit(1) ;
}
/* recupere le numero du port */
adsock.sin_port = sptr->s_port ;
/* creer maintenant un socket */
if((sd = socket(AF_INET,SOCK_STREAM,0))<0) {
printf("probleme lors de la creation de socket \n") ;
exit(1) ;
}
/* etablir la connexion avec le serveur */
if((connect(sd,( struct sockaddr * ) &adsock,sizeof(adsock))) < 0 ) {
printf("probleme de connexion \n") ;
exit(1) ;
}
/* on va envoyer la requete */
if((write(sd, mesg, strlen(mesg))) < 0 ) {
printf("erreur sur le write \n") ;
exit(1) ;
}
/* lecture de la reponse du serveur */
while((lon =read(sd, buf, sizeof(buf))) > 0)
/* affichage de la reponse sur l'ecran */
write(1, buf, lon) ;
/* on ferme le socket */
close(sd) ;
exit(0) ;
}
/* fin */
Ce que me donne l'exécution du client est ça, (alors que le serveur tourne avec sudo) :
david@david-desktop:~/Snet$ gcc rcv.c -o rcv
david@david-desktop:~/Snet$ ./rcv david-desktop mai
host=david-desktop
probleme d'infos sur le service
david@david-desktop:~/Snet$
Alors il ne me parait pas totalement anormal que le gethostbyname ne connaisse pas mon PC; alors pourrais-je lui demander d'être reconnu par l'adresse IP que mon FAI m'a attribuée aujourd'hui, et comment pourrais je la connaitre sans m'envoyer un mèl à moi même pour pouvoir lire mon adresse IP dans la source d'icelui, puisque c'est la seule méthode que je connaisse pour ce faire.
Merci de me donner quelques tuyaux,
David
Dernière modification par dva2tlse (Le 07/08/2008, à 13:35)
xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.
Hors ligne
#6 Le 07/08/2008, à 14:25
- Totor
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
Pourquoi dis-tu qu'il y a un problème avec gethostbyname alors que le résultat de ton test est :
"host=david-desktop
probleme d'infos sur le service"
... le host est bien trouvé... et il semble plutôt que ton soucis provienne de
if((sptr = getservbyname("2223","tcp")) == NULL ) {
printf("probleme d'infos sur le service \n") ;
exit(1) ;
}
-- Lucid Lynx --
Hors ligne
#7 Le 07/08/2008, à 14:58
- dva2tlse
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
le host est celui que je lui passe, et c'est le nom de mon PC puisque je veux juste faire un client serveur d'une fenêtre à l'autre.
Ça me paraissait "trop simple" qu'il prenne simplement le nom que je lui donne, mais tu as certainement raison puisque je n'avais pas vu que la phrase permettant de reconnaître l'erreur qui se produit se tenait plus loin.
Et je m'aperçois par la même occasion que le N° de port 2223 qui est donné est le même que celui que j'avais changé pour 21 dans le code du server et qui m'a obligé à le tourner en sudo.
Alors crois tu qu'il faille mieux que je passe celui là aussi en 21 ou que je remette l'autre en 2223 ?
David
xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.
Hors ligne
#8 Le 07/08/2008, à 15:05
- Totor
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
Voilà bien longtemps que je ne fais plus de C mais un petit man getservbyname me donne ceci :
..
The getservbyname() function returns a servent structure for the line
from /etc/services that matches the service name using protocol proto.
If proto is NULL, any protocol will be matched.The getservbyport() function returns a servent structure for the line
that matches the port port given in network byte order using protocol
proto. If proto is NULL, any protocol will be matched.
...
j'en déduis donc que ton paramétre est mauvais : il te faut mettre ftp (puisque tu utilises le 21 pour le serveur) à la place du numéro de port où utiliser getservbyport...
-- Lucid Lynx --
Hors ligne
#9 Le 07/08/2008, à 15:32
- dva2tlse
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
Oui c'est ce que je viens de faire et ça marche; je m'étais embrouillé entre le nom du service et son N° alors que, en effet, dans le code du serveur j'ai un getservbyname("ftp","tcp")); donc c'est bien du "ftp" qu'il faut que je mette et non pas le N° de port; et maintenant je vais voir dans le code lequel des deux ne réagit pas à la connexion avec l'autre si jamais elle était bien établie; et je vois à l'instant dans la fenêtre du serveur :
david@david-desktop:~/Snet$ gcc snd.c -o snd
david@david-desktop:~/Snet$ sudo ./snd
machine=david-desktop
Ok attente...
erreur lors de l'ouverture du fichier
Erreur de segmentation
david@david-desktop:~/Snet$
ce qui me parait une excellente chose puisqu'en réponse au deuxième argument "mai" qui lui est envoyé, il devrait renvoyer un horoscope du mois de mai or aucun fichier semblable n'a jamais existé sur mon PC, donc je vais juste modifier la conduite à tenir et YOUPI pour l'instant j'ai déjà réussi à faire réagir une fenêtre à ce qu'il se passe dans l'autre; bon dak', c'est pas très évolué comme réaction, un vulgaire plantage, mais c'est déjà kèkchoz'.
À bientôt peut-être pour de bonnes nouvelles,
David
xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.
Hors ligne
#10 Le 07/08/2008, à 15:56
- dva2tlse
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
ÇA MARCHE, c'est fantastique et fabuleux et tout ce qu'on veut; et un gigantesque MERCI à toi et à tes encore efficaces souvenirs de C.
(J'ai juste modifié le code du serveur pour qu'il envoie un fichier nomme "mai", complètement bidon, que j'ai crée pour l'occasion, et le client le reçoir et l'affiche)
Je mets ci dessous les codes simplistes de mon client et de son serveur, si un grand débutant comme moi qui se traine 44 ans de connerie cherche à piger quelque chose au net.
Et merci encore,
David
/* ceci est un essai pour comprendre ce qui se passe avec le net */
/* programme client */
/* gcc rcv.c -o rcv */
/* ./rcv david-desktop mai */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
main(argc,argv)
int argc ;
char *argv[] ;
{
int sd,lon ;
struct sockaddr_in adsock;
struct hostent *hptr ; /* infos recuperes sur le host */
struct servent *sptr ; /* infos recuperes sur le service */
char addr[16] ; /* buffer de stockage de l'adresse; DVA le 7/08/2008 */
char buf[256] ; /* buffer de lecture des infos */
char *prog ; /* nom de ce programme */
char *host ; /* pointeur sur le nom du host distant */
char *mesg ;
char *resg ; /* pointeur sur l'utilisateur distant */
prog = argv[0] ;
/* verification du nombre d'arguments de la ligne de commande */
if (argc != 3) {
printf("il faut trois arguments\n") ;
exit(1) ;
}
host = argv[1] ;
mesg = argv[2] ;
/* prendre les infos sur le host */
/* DVA le 7/08/2008: */
printf("host=%s\n",host);
if((hptr = gethostbyname(host)) == NULL) {
perror("gethostbyname");
printf("probleme d'infos sur le host \n") ;
exit(1) ;
}
/* initialiser la struct adsock avec les infos recuperes */
/* c a d l'adresse du host et le domaine internet */
bcopy((char *)hptr->h_addr,(char*)&adsock.sin_addr,hptr->h_length) ;
adsock.sin_family = hptr->h_addrtype ;
/* prendre les infos sur le service */
if((sptr = getservbyname("ftp","tcp")) == NULL ) {
printf("probleme d'infos sur le service \n") ;
exit(1) ;
}
/* recupere le numero du port */
adsock.sin_port = sptr->s_port ;
/* creer maintenant un socket */
if((sd = socket(AF_INET,SOCK_STREAM,0))<0) {
printf("probleme lors de la creation de socket \n") ;
exit(1) ;
}
/* etablir la connexion avec le serveur */
if((connect(sd,( struct sockaddr * ) &adsock,sizeof(adsock))) < 0 ) {
printf("probleme de connexion \n") ;
exit(1) ;
}
/* on va envoyer la requete */
if((write(sd, mesg, strlen(mesg))) < 0 ) {
printf("erreur sur le write \n") ;
exit(1) ;
}
/* lecture de la reponse du serveur */
while((lon =read(sd, buf, sizeof(buf))) > 0)
/* affichage de la reponse sur l'ecran */
write(1, buf, lon) ;
/* on ferme le socket */
close(sd) ;
exit(0) ;
}
/* fin */
/* ceci est un essai pour comprendre ce qui se passe avec le net */
/* gcc snd.c -o snd */
/* mysocket = socket(int socket_family, int socket_type, int protocol); */
/* The protocol modules are grouped into protocol families like PF_INET, PF_IPX, PF_PACKET and socket types like SOCK_STREAM or SOCK_DGRAM */
/* socket(2) creates a socket, connect(2) connects a socket to a remote socket address, the bind(2) function binds a socket to a local socket address, listen(2) tells the socket that new connections shall be accepted, and accept(2) is used to get a new socket with a new incoming connection. */
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#define MAXNOM 32
void renvoi(int s) ;
/* programme serveur */
main(argc,argv)
int argc ;
char *argv[] ;
{
int sd,lacc, nsd ;
struct sockaddr_in adsock, adacc; /* struc adresse internet */
struct hostent *hptr ; /* infos recuperes sur le host */
struct servent *sptr ; /* infos recuperes sur le service */
char machine[MAXNOM+1] ; /* nom de la machine locale */
char *prog ; /*nom de ce programme */
char *mesg ;
prog = argv[0] ;
/* prendre les infos sur le service */
/* struct servent *getservbyname(const char *name, const char *proto); */
if((sptr = getservbyname("ftp","tcp")) == NULL ) {
printf("probleme : service inconnu\n") ;
exit(1) ;
}
/* recuperer le nom de la machine locale */
gethostname(machine,MAXNOM) ;
/* DVA le 7/08/2008: */
printf("\nmachine=%s\n",machine);
/* prendre les infos sur la machine locale */
if((hptr = gethostbyname(machine)) == NULL) {
printf("probleme : host inconnu\n") ;
exit(1) ;
}
bzero((char*)&adsock, sizeof(adsock));
/*initialiser la struct adsock avec les infos recuperes */
bcopy((char *)&hptr->h_addr,(char*)&adsock.sin_addr,hptr->h_length) ;
adsock.sin_family = AF_INET ;
/* recupere le numero du port */
adsock.sin_port = sptr->s_port ;
adsock.sin_addr.s_addr = INADDR_ANY ;
/* creer maintenant un socket */
if((sd = socket(AF_INET,SOCK_STREAM,0))<0) {
printf("probleme lors de la creation de socket \n") ;
exit(1) ;
}
/* DVA le 7/08/2008: */
// printf("socket Ok; sd=%d\n",sd);
/* on va faire un bind sur le socket */
/* mais avant y faudrait contrôler la sockaddr */
/* int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); */
if(bind(sd,(struct sockaddr *) &adsock ,sizeof(adsock) ) == -1 ) {
perror("bind");
printf("problème avec le bind\n") ;
exit(1) ;
}
/* initialiser la queue d'écoute */
listen(sd,5) ; /* backlog = 5 */
/* boucle d'attente de nouvelles connexions */
/* DVA le 7/08/2008: */
printf("Ok attente...\n\n");
for(;;){
lacc = sizeof(adacc) ;
/* boucle d'accept */
if((nsd = accept(sd, ( struct sockaddr * ) &adacc, &lacc)) < 0 )
{
/* adacc -> infos du client */
printf("erreur sur l'accept \n") ;
exit(1) ;
}
renvoi(nsd) ;
close(nsd);
}
}
/* fonction renvoi */
void renvoi(s)
int s ;
{
char buf[256];
char *fichier;
char f[20];
char *mesgptr;
char mesg[250];
int l, c;
FILE *fp ;
char line[250] ={0} ;
char *lineptr = NULL;
/* lire une requete */
if((l=read(s, buf, sizeof(buf))) <= 0)
return ;
buf[l] = '\0' ; /*fin de chaine */
fichier=f;
if (!strcmp(buf,"mai")) fichier = "mai" ;
if (!strcmp(buf,"lion")) fichier = "lion" ;
if (!strcmp(buf,"cancer")) fichier = "cancer" ;
if (!strcmp(buf,"scorpion")) fichier = "scorpion" ;
if (!strcmp(buf,"taureau")) fichier = "taureau" ;
if (!strcmp(buf,"vierge")) fichier = "vierge" ;
if (!strcmp(buf,"poisson")) fichier = "poisson" ;
if (!strcmp(buf,"capricorne")) fichier = "capricorne" ;
if (!strcmp(buf,"balance")) fichier = "balance" ;
if (!strcmp(buf,"belier")) fichier = "belier" ;
if (!strcmp(buf,"verseau")) fichier = "verseau" ;
if (!strcmp(buf,"gemeaux")) fichier = "gemeaux" ;
if((fp=fopen(fichier,"r"))==NULL) {
printf("erreur lors de l'ouverture du fichier\n");}
while(fgets(line,240,fp)){
write(s, line, strlen(line)) ;
}
return ;
}
/* fin */
xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.
Hors ligne
#11 Le 07/08/2008, à 16:11
- nicolas.sitbon
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
/* ceci est un essai pour comprendre ce qui se passe avec le net */ /* gcc snd.c -o snd */ /* mysocket = socket(int socket_family, int socket_type, int protocol); */ /* The protocol modules are grouped into protocol families like PF_INET, PF_IPX, PF_PACKET and socket types like SOCK_STREAM or SOCK_DGRAM */ /* socket(2) creates a socket, connect(2) connects a socket to a remote socket address, the bind(2) function binds a socket to a local socket address, listen(2) tells the socket that new connections shall be accepted, and accept(2) is used to get a new socket with a new incoming connection. */ #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #define MAXNOM 32 void renvoi(int s) ; /* programme serveur */ main(argc,argv) int argc ; char *argv[] ; { int sd,lacc, nsd ; struct sockaddr_in adsock, adacc; /* struc adresse internet */ struct hostent *hptr ; /* infos recuperes sur le host */ struct servent *sptr ; /* infos recuperes sur le service */ char machine[MAXNOM+1] ; /* nom de la machine locale */ char *prog ; /*nom de ce programme */ char *mesg ; prog = argv[0] ; /* prendre les infos sur le service */ /* struct servent *getservbyname(const char *name, const char *proto); */ if((sptr = getservbyname("ftp","tcp")) == NULL ) { printf("probleme : service inconnu\n") ; exit(1) ; } /* recuperer le nom de la machine locale */ gethostname(machine,MAXNOM) ; /* DVA le 7/08/2008: */ printf("\nmachine=%s\n",machine); /* prendre les infos sur la machine locale */ if((hptr = gethostbyname(machine)) == NULL) { printf("probleme : host inconnu\n") ; exit(1) ; } bzero((char*)&adsock, sizeof(adsock)); /*initialiser la struct adsock avec les infos recuperes */ bcopy((char *)&hptr->h_addr,(char*)&adsock.sin_addr,hptr->h_length) ; adsock.sin_family = AF_INET ; /* recupere le numero du port */ adsock.sin_port = sptr->s_port ; adsock.sin_addr.s_addr = INADDR_ANY ; /* creer maintenant un socket */ if((sd = socket(AF_INET,SOCK_STREAM,0))<0) { printf("probleme lors de la creation de socket \n") ; exit(1) ; } /* DVA le 7/08/2008: */ // printf("socket Ok; sd=%d\n",sd); /* on va faire un bind sur le socket */ /* mais avant y faudrait contrôler la sockaddr */ /* int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); */ if(bind(sd,(struct sockaddr *) &adsock ,sizeof(adsock) ) == -1 ) { perror("bind"); printf("problème avec le bind\n") ; exit(1) ; } /* initialiser la queue d'écoute */ listen(sd,5) ; /* backlog = 5 */ /* boucle d'attente de nouvelles connexions */ /* DVA le 7/08/2008: */ printf("Ok attente...\n\n"); for(;;){ lacc = sizeof(adacc) ; /* boucle d'accept */ if((nsd = accept(sd, ( struct sockaddr * ) &adacc, &lacc)) < 0 ) { /* adacc -> infos du client */ printf("erreur sur l'accept \n") ; exit(1) ; } renvoi(nsd) ; close(nsd); } } /* fonction renvoi */ void renvoi(s) int s ; { char buf[256]; char *fichier; char f[20]; char *mesgptr; char mesg[250]; int l, c; FILE *fp ; char line[250] ={0} ; char *lineptr = NULL; /* lire une requete */ if((l=read(s, buf, sizeof(buf))) <= 0) return ; buf[l] = '\0' ; /*fin de chaine */ fichier=f; if (!strcmp(buf,"mai")) fichier = "mai" ; if (!strcmp(buf,"lion")) fichier = "lion" ; if (!strcmp(buf,"cancer")) fichier = "cancer" ; if (!strcmp(buf,"scorpion")) fichier = "scorpion" ; if (!strcmp(buf,"taureau")) fichier = "taureau" ; if (!strcmp(buf,"vierge")) fichier = "vierge" ; if (!strcmp(buf,"poisson")) fichier = "poisson" ; if (!strcmp(buf,"capricorne")) fichier = "capricorne" ; if (!strcmp(buf,"balance")) fichier = "balance" ; if (!strcmp(buf,"belier")) fichier = "belier" ; if (!strcmp(buf,"verseau")) fichier = "verseau" ; if (!strcmp(buf,"gemeaux")) fichier = "gemeaux" ; if((fp=fopen(fichier,"r"))==NULL) { printf("erreur lors de l'ouverture du fichier\n");} while(fgets(line,240,fp)){ write(s, line, strlen(line)) ; } return ; } /* fin */
Je me suis cassé la tête à corriger ton code et tu nous remets des horreures pareilles????
Hors ligne
#12 Le 07/08/2008, à 16:40
- dva2tlse
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
Pardon je n'avais même pas lu ce que tu avais posté; dis-moi alors quelles sont les horreurs à éviter.
(Je ne suis pas vaillant du tout en C, et j'utilise juste le fortran dans mon boulot pour faire de simples moulinettes séquentielles avec un fichier d'entrée et un de sortie)
Je vais faire un diff entre ton fichier et le mien, mais peux tu me dire aussi comment faire pour ne pas utiliser de port privilègié et que quiconque puisse faire tourner le côté serveur.
Merci encore,
David
Dernière modification par dva2tlse (Le 07/08/2008, à 16:42)
xubuntu 22.04 dans un PC assemblé
PS: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.
Hors ligne
#13 Le 07/08/2008, à 18:16
- Totor
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
Je me suis cassé la tête à corriger ton code et tu nous remets des horreures pareilles????
mdr
Je n'avais pas vu ton post non plus sur CCM !
PS pour dva2tlse :
Je n'ai aucun mérite ni gloire à en tirer... juste un peu de bon sens
-- Lucid Lynx --
Hors ligne
#14 Le 07/08/2008, à 18:35
- nicolas.sitbon
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
nicolas.sitbon a écrit :Je me suis cassé la tête à corriger ton code et tu nous remets des horreures pareilles????
mdr
Je n'avais pas vu ton post non plus sur CCM !
CCM? tu veux dire developpez.com?
Hors ligne
#15 Le 07/08/2008, à 19:16
- Totor
Re : [RÉSOLU] comment afficher les membres d'une struct ? (clnt-srvr)
oui...effectivement désolé !
-- Lucid Lynx --
Hors ligne