prob avec struct sockaddr_in et inet_addr - C - Programmation
Marsh Posté le 24-03-2006 à 09:24:24
yartempion a écrit : Quand je compile j'obtients un mmessg |
Il faudrait déjà que ça compile...
|
Une fois que ça compile :
Code :
|
Ce programme est extrêmement fragile.
Ceci fonctionne correctement
Code :
|
Marsh Posté le 25-03-2006 à 12:37:02
Slt
Merci d'avoir pris le pb
J'ai remanie la routine et voici ce que ca donne:
#include <stdio.h>
#include <netinet/in.h>
#include<sys/socket.h>
#include<netdb.h>
#include <string.h>
#include<unistd.h>
#define LG_BUFFER 1024
main(argc,argv)
int argc;
char** argv;
{
char buffer[LG_BUFFER];
int sock_com,nb_lus,port=23;
struct sockaddr_in adresse_distante;
struct servent num_port;
printf("\nadresse de argv[1] %s",argv[1]);
memset (& adresse_distante,0,sizeof(struct sockaddr_in));
printf("\ninitialisation du bloc memoire adresse_distante" );
adresse_distante.sin_family=AF_INET;
printf("\nAF_INET OK" );
adresse_distante.sin_port=htons(port);
printf("\nport OK" );
if((adresse_distante.sin_addr.s_addr=inet_addr(argv[1]))==INADDR_NONE)
perror("\nAdresse distante inconnue" );
else
printf("\nResultat de inet_addr %X\n",adresse_distante.sin_addr.s_addr);
printf("\ncreation de la socket" );
if ((sock_com=socket(AF_INET,SOCK_STREAM,0))<0)
perror("\nCreation de la socket echouee" );
printf("\nsocket cree Ref sock_com=%d",sock_com);
printf("\ntentative de connection au distant" );
if(connect(sock_com,&adresse_distante,sizeof(struct sockaddr_in))<0)
{
perror("\nerreur sur connect\n" );
exit(1);
}
setvbuf(stdout,_IONBF,0);
while(1)
{
if((nb_lus=read(sock_com,buffer,LG_BUFFER))==0)
break;
if(nb_lus<0)
{
perror("\nerreur sur lecture socket\n" );
exit(1);
}
write(STDOUT_FILENO,buffer,nb_lus);
}
close(sock_com);
printf("\n" );
/*free(adresse);*/
}
Quand je lance ca marche
./communication1 127.0.0.1
adresse de argv[1] 127.0.0.1
initialisation du bloc memoire adresse_distante
AF_INET OK
port OK
Resultat de inet_addr 7F000001
creation de la socket
socket cree Ref sock_com=3
tentative de connection au distant »$
mais rien de lisible sur la socket pourquoi?
Pourquoi je n'arrive pas a lire les donnees envoyes par mon serveur telnet?
Marsh Posté le 25-03-2006 à 17:23:25
salut,
J'essaie de créer un serveur UDP et un client UDP qui echangent des messages. Mais je n'arrive pas a reccuperer l adresse IP du client dans mon serveur.
je fais :
printf("Adresse %s\n", inet_ntoa(son_s->sin_addr));
et il imprime :
Adresse 0.0.0.0
I need help..
Merci.
Marsh Posté le 25-03-2006 à 17:27:34
dounia2 a écrit : salut, |
tiens, on finit son tp de sr03
il faudrait un peu plus de precisions pour pouvoir repondre
Marsh Posté le 25-03-2006 à 17:33:36
ArthurDent a écrit : tiens, on finit son tp de sr03 |
Lol, j'en deduis que tu fais sr03 aussi
Ben je n'arrive tout simplement pas a imprimer l'adresse de mon client. Et je ne sais pas ou aller la chercher dans la structure sockaddr_in..
Code :
|
Voila a quoi ca ressemble :s
Marsh Posté le 25-03-2006 à 17:41:25
essaie en rajoutant ça au debut de ton code
Code :
|
où argv[1] est le nom d'hote que tu passes en parametre, remplace par "localhost" si tu le pase pas en parametre
Marsh Posté le 25-03-2006 à 17:46:49
mais en faisant ca je reccupere l @ IP de mon serveur, je me trompe? moi je veux celle du client, donc celle de son_s apres le recvfrom().
Marsh Posté le 25-03-2006 à 17:54:21
desolée j'avais oublié de préciser que c t le code du server
Marsh Posté le 25-03-2006 à 18:07:51
il faut mettre
Code :
|
a la place de
Code :
|
sinon tu recupere la taille du pointeur (4) et pas la taille de sockaddr_in
Marsh Posté le 25-03-2006 à 18:25:32
Une dernere question:
a l execution des fois j'obtient:
> ./udpser 4679
udpser.c: err bind: Address already in use
errno =29
Exit 1
Tu sais comment liberer le port?
Merci encore ArthurDent
Marsh Posté le 25-03-2006 à 18:45:36
Rslt,
Je suis toujours bloque par cette histoire de lecture sur la socket du client qui se connecte a un serveur telnet comment recuperer les donnees ou ne faudrait il pas activer un NVT sur la socket?
Marsh Posté le 25-03-2006 à 19:50:58
yartempion a écrit : Rslt, |
c'est quoi NVT?
pourquoi n'utilise tu pas recv au lieu de read?
Marsh Posté le 25-03-2006 à 22:37:52
Quel est la difference entre un recv et read.
NVT network Virtual terminal permet d'effectuer une conversion des donnees et de modifier les caracteristique d'un terminal.
Exp Quand on saisi au clavier les donnees ne sont prises en compte que si on appuie sur la touche enntrer on modifier ce comportement pour que la frappe soit lue immediatement. Les machines code les donnees sur un certains nombre de bits alors que sur le reseau il est parfois preferable de les coder d'une maniere normalisee pour que toutes les machines puissent les interpreter.
Marsh Posté le 26-03-2006 à 22:55:52
yartempion a écrit : J'ai remanie la routine et voici ce que ca donne: |
Je ne regarde pas ça tant qu'il n'y a pas les balises code... C'est compliqué de clicker sur ou ?
Code :
|
Je parle aux murs ou quoi ?
Citation : Pour socket(), le premier paramètre est 'Protocol Family', soit PF_xxx et non 'Address Family' AF_xxx. |
Marsh Posté le 27-03-2006 à 00:49:35
Emmanuel Delahaye a écrit : Je ne regarde pas ça tant qu'il n'y a pas les balises code... C'est compliqué de clicker sur http://forum-images.hardware.fr/ic [...] e/fixe.gif ou http://forum-images.hardware.fr/icones/message/c.gif ?
|
Salut et toutes mes excuses j'avais oublie
Code :
|
Marsh Posté le 27-03-2006 à 09:18:16
Salut,
Je crois qu'on peut tout aussi bien utiliser AF_INET que PF_INET le probleme ne vient d'un erruer programme mais plutot d'une erreur protocolaire du telnet. Je pense qu'il faudrai que je vois comment sont codes les octet et que je traverse un NVT pour les transformer du format telnet au format de ma machine. Pour l'instant je n'y artive pas.
Marsh Posté le 27-03-2006 à 09:21:53
yartempion a écrit : Je crois qu'on peut tout aussi bien utiliser AF_INET que PF_INET |
Non. Je ne dis pas que c'est ça la cause de tes problèmes, mais commence déjà par utiliser les fonctions correctement :
http://www.linux-kheops.com/doc/ma [...] ket.2.html
Marsh Posté le 27-03-2006 à 10:17:04
Merci pour le lien.
Je ne vois pas trop quelle fonction peche.
Marsh Posté le 27-03-2006 à 12:14:37
Emmanuel Delahaye a écrit : Non. Je ne dis pas que c'est ça la cause de tes problèmes, mais commence déjà par utiliser les fonctions correctement : |
Vu que le lien concerne socket(), y'a pas trop à chercher... D'autre part, ce lien précise que le paramètre est bien PF_INET et non AF_INET comme tu l'a ecrit de façon erronée
Nota : Cette erreur est fréquente, y compris dans de nombreux tutoriels et exemples sur le net ou dans des cours de fac et autres. La confusion vient de ce que la valeur de ces deux macros est souvent 0, ce qui fait que l'erreur est sans effet dans la plupart des cas...
Mais ne pas respecter la définition et l'usage des fonctions, c'est mal.
Marsh Posté le 27-03-2006 à 13:15:33
En effet sur toutes les docs que j'ai consulte AF_INET est indique.
Visiblement AF_INET doit servir pour les struct sockaddr_in et PF_INET pour les socket mais je ne suis plus tres sur.
Mais le pb reste entier, je ne lis toujours tien sur la socket.
Marsh Posté le 27-03-2006 à 13:59:17
Citation : /usr/ccs/bin/ld: (Warning) At least one PA 2.0 object file (communication1.o) was detected. The linked output may not run on a PA 1.x system. |
si ld te sort ca il est probable que ca merde à l'execution, c'est un probleme qui concerne l'installation de la bibliothèque concernée
Marsh Posté le 28-03-2006 à 12:14:37
Bonjour,
Je n'ai toujours pas resolut mon probleme.
Je pense etre sur la bonne voie en faisant une modif sur le terminal d'entree. D'apres ce que j'ai compris il faut passer l'entree en mode brut afin de coller aux exigences de telnet.
Si quelqu'un connait la solution merci
Marsh Posté le 24-03-2006 à 07:28:09
Bonjour,
j'essaie de creer un prog client qui puisse faire de la communication ip avec un serveur telnet.
Je butte sur un pb voici un partie du prog.
#include <stdio.h>
#include <netinet/in.h>
#include<sys/socket.h>
#include<netdb.h>
#include <string.h>
main(argc,argv)
int argc;
char* argv[];
{
int sock_com,port=23;
struct sockaddr_in adresse_distante;
struct servent num_port;
unsigned long chif_addr;
struct in_addr adresse;
printf("\nadresse de argv[1] %s",argv[1]);
if ((sock_com=socket(AF_INET,SOCK_STREAM,0))<0)
perror("\nCreation de la socket echouee" );
printf("\nsocket cree" );
memset (& adresse_distante,0,sizeof(struct sockaddr_in));
printf("\ninitialisation du bloc memoire adresse_distante" );
adresse_distante.sin_family=AF_INET;
printf("\nAF_INET OK" );
adresse_distante.sin_port=htons(port);
printf("\nport OK" );
chif_addr=inet_addr(argv[1]);
printf("\nresultat %X",chif_addr);
if((adresse.s_addr=inet_addr(argv[1]))==INADDR_NONE)
/*if((adresse_distante.sin_addr.s_addr=inet_addr(argv[1]))==INADDR_NONE)*/;
perror("\nAdresse distante inconnue" );
free(adresse);
}
Quand je compile j'obtients un mmessg
/usr/ccs/bin/ld: (Warning) At least one PA 2.0 object file (communication1.o) was detected. The linked output may not run on a PA 1.x system.
que je ne comprend pas mais j'obtients un exe quand meme et quad je lance cet exe avec l'argument 127.0.0.1 je recois:
msgcnt 214 vxfs: mesg 001: vx_nospace - /dev/vg00/lvol5 file system full (1 block extent)
Bus error
avec l'argument 192.168.1.2
Memory fault(coredump)
quel est le prob dans l'attribution de l@ ip distante?