emine88
Messages postés2Date d'inscriptionvendredi 19 septembre 2008StatutMembreDernière intervention11 octobre 2008
-
10 oct. 2008 à 17:57
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 2014
-
13 oct. 2008 à 10:44
Salut à tous
j'essaye de realiser un programme serveur/client en C++ sous Linux avec Kdevelop ,mon probleme est: au cours de la compilation sous console j'ai le message suivant : " erreur: winsock2.h : Aucun fichier ou répertoire de ce type "
code source:
#include<stdio.h>
#include<winsock2.h>
void main()
{
int s;
sockaddr_in sa;
char buffer[255];
//creation de la socket
s=socket(AF_INET,SOCK_STREAM,0);
sa.sin.family=AF_INET;
sa.sin.port=hton(7777);
sa.sin_addr.s_addr=inet_addr("127.0.0.1");
//demande de connection au serveur
connect(s,(sockaddr*)&sa,sizeof(sa));
printf(" entrer un message \n ");
scanf("%s",buffer);
[root@localhost TP 1]# gcc -o tcp-c client-tcp.c
client-tcp.c:3:21: erreur: winsock2.h : Aucun fichier ou répertoire de ce type
client-tcp.c: In function ‘main’:
client-tcp.c:8: erreur: ‘sockaddr_in’ undeclared (first use in this function)
client-tcp.c:8: erreur: (Each undeclared identifier is reported only once
client-tcp.c:8: erreur: for each function it appears in.)
client-tcp.c:8: erreur: expected ‘;’ before ‘sa’
client-tcp.c:11: erreur: ‘AF_INET’ undeclared (first use in this function)
client-tcp.c:11: erreur: ‘SOCK_STREAM’ undeclared (first use in this function)
client-tcp.c:12: erreur: ‘sa’ undeclared (first use in this function)
client-tcp.c:17: erreur: ‘sockaddr’ undeclared (first use in this function)
client-tcp.c:17: erreur: expected expression before ‘)’ token
client-tcp.c:6: attention : return type of ‘main’ is not ‘int’
-comment je peut ajouter la bibliotheque winsock2.h
merci pour votre aide ! (y) ;)
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 10 oct. 2008 à 19:37
Bienvenue !
Dans winsock, il y a win... Win ne te dis rien ?
Il est pourtant dans windows !
Bref, remplace ton include de winsock2.h par une include de socket.h.
Tu peux faire de la compilation conditionnelle si tu veux rendre le code portable.
Attention : il y a quelques différences entre les différents headers de socket... Autrement dit, tu risques d'avoir quand même des erreurs à la compilation. Mais tu pourras les corriger.
int main()
{
int s;
struct sockaddr_in sa;
char buffer[255];
//creation de la socket
s=socket(AF_INET,SOCK_STREAM,0);
sa.sin_family=AF_INET;
sa.sin_port=htons(7777);
sa.sin_addr.s_addr=inet_addr("127.0.0.1");
//demande de connection au serveur
connect(s,(struct sockaddr*)&sa,sizeof(sa));
le program fonctionne correctement ! merci bien ?
mais juste je veux savoire le rôle de la bibliotheque <netinet/in.h> ,si je compile sans cette bibliotheque je trouve:
[root@localhost TP 1]# gcc -o tcp-c client-tcp.c
client-tcp.c: In function ‘main’:
client-tcp.c:8: erreur: storage size of ‘sa’ isn’t known
[root@localhost TP 1]#
est ce que vous avez une explication plus détaillé ou plus profesionnelle et pour cette bibliotheque quelle est sont rôle ?
merci de mexplique je suis debutant en linux ! ;)
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 13 oct. 2008 à 10:44
On ne parle pas vraiment de bibliothèque quand on parle d'un .h. Une bibliothèque c'est souvent plus gros. On parle plutôt de header, ou de fichier d'en-tête en français.
Ici :
struct sockaddr_in sa;
Tu déclares une structure de type sockaddr_in qui s'appelle sa.
Il se trouve que le header in.h du répertoire netinet contient la définition de ce type :
<hr />
/* Structure describing an Internet socket address. */
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */
/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
<hr />
Si tu n'inclus pas ce header, le compilateur ne connais pas le type sockaddr_in et ne peut donc pas compiler ton programme.
Outre le type sockaddr_in, in.h contient des information diverses concernant les sockets, telles que les principaux ports, par exemple :
IPPORT_TELNET = 23,
La taille sur laquelle est codée un numéro de port :
typedef uint16_t in_port_t;
(Les ports vont de 0 à 65535).
La taille représentant les adresses IP :
typedef uint32_t in_addr_t;
(Les adresses IP, représentée XXXX.XXXX.XXXX.XXXX sont codées sur 4 octets).
Je ne crois pas que le reste soit souvent utilisé, notamment la partie IPv6 (Presque tout le monde est encore en IPv4 à l'heure actuelle).