Probleme-> winsock2.h : Aucun fichier ou répertoire de ce type [Résolu]

Signaler
Messages postés
2
Date d'inscription
vendredi 19 septembre 2008
Statut
Membre
Dernière intervention
11 octobre 2008
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
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);

send(s,buffer,sizeof(buffer),0);
printf("message envoyé \n ");

closesocket(s);
}

sous conole :

[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) ;)

3 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
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.
Messages postés
2
Date d'inscription
vendredi 19 septembre 2008
Statut
Membre
Dernière intervention
11 octobre 2008

oui merci
j'ai remplacer  <winsock2.h> par <sys/socket.h> ,quelques erreurs sont apparu mais je les corrigées :
nouveau code source:

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

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));

printf(" entrer un message \n ");
scanf("%s",buffer);
send(s,buffer,sizeof(buffer),0);
printf("message envoyé \n ");

//closesocket(s);
return 0;
}

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 ! ;)
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
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).