Votre navigateur est obsolète. Téléchargez un navigateur moderne, par exemple FireFox.
Léa-Linux : Forum
Le forum de Léa abrite des discussions autour des Logiciels libres.
Syndication
  • RSS ForumForum complet
  • RSS Forum - DéveloppementForum - Développement
  • RSS Forum - Développement - 130684Cette discussion

Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Important : quand vous posez une question, n'oubliez pas de nous donner les indications suffisantes pour que nous puissions répondre. En effet, la divination n'est pas le fort du Linuxien averti. Pour une meilleure compréhension, le bon usage de la grammaire et de l'orthographe est fortement encouragé. En particulier, le langage SMS est à éviter absolument. En cas d'abus, il pourra être censuré sans autre forme de procès.
Les messages dont le contenu est illégal (incitant à la haine - raciale ou autre, diffamant), ou dont le contenu est sans rapport avec le sujet du forum, ou qui sont parfaitement stupides ou hors sujet seront supprimés sans pitié. Il pourra même être fait appel au fournisseur d'accès du coupable pour faire cesser ses agissements.
» Index du forum » Développement » include
Aller à la discussion: PrécédentSuivante
Action: Nouveau sujetChercherS'authentifier
include
Auteur: bloodaxe (IP enregistrée)
Date: le 12 février 2004 à 20:40

Bonjour je fai un petit programme incluant des sockets seulement ce ne veu pas compiler il me sort des erreurs comme koi mempcy et non déclarer strlen et non declarer, alors que les fichier include son bien present je ne comprend pas du tout, le programme compile bien sur un autre ordi sous linux et chez moi rien a faire. je suis sous mdk 9.2 merci de m'aider

Re: include
Auteur: LF (IP enregistrée)
Date: le 12 février 2004 à 23:29

affiche nous la trace que tu obtient ainsi que tes commande de compil plz

Re: include
Auteur: bloodaxe (IP enregistrée)
Date: le 13 février 2004 à 16:39

ben en faite c bon g reussi a configurer tous seul, merci kan meme

Re: include
Auteur: bloodaxe (IP enregistrée)
Date: le 13 février 2004 à 22:08

ne tennez pa compte du message que j'ai mis c'etai pour un autre poste desolé

voila les erreur qui s'affiche, merci de maider

socket.cpp: In function `int main()':
socket.cpp:53: error: `memcpy' undeclared (first use this function)
socket.cpp:53: error: (Each undeclared identifier is reported only once for each function it appears in.)
socket.cpp:66: error: invalid conversion from `const char*' to `int'
socket.cpp:71: error: invalid conversion from `int*' to `socklen_t*'
socket.cpp:82: error: `strlen' undeclared (first use this function)

Re: include
Auteur: svear (IP enregistrée)
Date: le 14 février 2004 à 01:12

Le problème du langage C est qu'il faut que le compilateur connaisse le type de chaque variable et chaque fonction qu'il aura à utiliser avant que tu les utilises.
Jusqu'à présent, si tu utilisais une fonction sans l'avoir déclarée, le compilo la mettait "int" par défaut mais ce comportement s'est durci et maintenant, il ne veut plus rien savoir.

En ligne 53, tu utilises "memcpy". Il faut donc que tu déclares cette fonction au début de ton source en y mettant la ligne
void *memcpy(void*, void*);

Fort heureusement, tu as à ta disposition des headers (fichiers ".h") qui contiennent toutes les déclarations des fonctions correspondantes.
Tu peux donc à la place mettre la ligne suivante:
#include <memory.h>

En ligne 66, je pense que tu essayes d'appeler une fonction qui utilise un entier et tu lui passes un pointeur sur un caractère (adresse). Bien qu'une adresse soit un nombre entier, le compilo n'aime pas du tout. Mais il me faudrait voir la ligne incriminée pour mieux te répondre

En ligne 71, c'est le même truc. Tu as un pointeur sur un entier et tu l'utilises comme pointeur sur "socklen_t" Mais j'aimerais mieux voir la ligne pour être certain de ma réponse

Ligne 82 pareil que ligne 53. Soit tu déclares la fonction "int strlen(char *); soit tu inclues le fichier "string.h" en mettant en début de ton source
#include <string.h>

Re: include
Auteur: bloodaxe (IP enregistrée)
Date: le 14 février 2004 à 14:19

voila le source

#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>
#include <memory.h>

#define TPTCP 13001

int main ()
{
char trame[128];
int sock, sock2, rts, lg_addr;
struct sockaddr_in sockname;
struct hostent *host;

host= gethostbyname("localhost");
if(host==(struct hostent *)NULL)
{
perror("Host inconnu\n");
exit(0);
}
else printf("Host connu! `\n");

sock=socket(AF_INET, SOCK_STREAM, 0);
if(sock== -1)
{
printf("Pas de socket");
exit(0);
}
else printf("Socket OK");

sockname.sin_family=(AF_INET);
sockname.sin_port=htonl(TPTCP);
memcpy(&sockname.sin_addr.s_addr,host->h_addr,host->h_length);

rts=bind(sock, (struct sockaddr *)&sockname, sizeof(sockname));

if(rts==-1)
{
printf("bind erreur");
}

rts=listen(sock, 5);
if(rts==-1)
{
perror("erreur listen");
close("sock");
exit(0);
}

lg_addr=host->h_length;
sock2=accept(sock,(struct sockaddr *)&sockname, &lg_addr);
if(sock2==-1);
{
perror("pb accept");
close(sock);
exit(0);
}

rts=recv(sock2, trame, 128, 0);
printf("Trame recue : %s\n",trame);
printf("Reponse: ");;gets(trame);
send(sock2, trame, strlen(trame)+1,0);
close(sock2);
close(sock);

}

Re: include
Auteur: svear (IP enregistrée)
Date: le 14 février 2004 à 17:13

Ok - Tout d'abord quelques petits trucs qui t'éviteront de gros ennuis

1) toujours mettre les "#include <sys/machin.h>" en premier car ce sont les plus important et il se peut que le "toto.h" qui a besoin du "sys/machin.h" ne l'inclue pas (tout le monde ne programme pas toujours comme il faudrait) donc de ton coté, pour pas avoir de soucis, tu mets tous les <sys/machin.h> en premier, surtout le "<sys/types.h>"

2) Afin d'être tranquille, je te conseille aussi de mettre avant le remplissage de sockname la ligne "memset(&sockname, 0, sizeof(struct sockaddr_in));" afin d'être certain que les zones non-initialisées soient à 0

3) ta ligne "bind" n'est pas bonne mais je comprends ton erreur. Dans le man, tu as lu que le prototype de "bind" acceptait en second argument un "struct sockaddr*" alors tu caste ton pointeur en "struct sockaddr*" ce qui est parfait dans 99% des cas, sauf ici.
En effet, les sockets acceptent des communications an AF_INET ou AF_UNIX. Ainsi, le man de "bind" explique la fonction de façon schématisée pour les deux domaines mais dans la réalité, le "bind" accepte directement des adresses sur un pointeur "sockaddr_in" dans le cas du "INET" et "sockaddr_un" dans le cas du "UNIX".
Voici la ligne que tu dois mettre:
rts=bind(sock, &sockname, sizeof(sockname));
ou bien
rts=bind(sock, &sockname, sizeof(struct sockaddr_in));

4) la ligne "accept" n'est pas bonne du tout. La structure "sockaddr_in" qu'elle reçoit en paramètre est destinée à stocker l'adresse du client qui se connecte à ton serveur. il te faut donc une deuxième variable que tu peux appeler "struct sockaddr_in adr_client" et tu appelle
accept(sock, &adr_client, &lg_addr);
Ici non-plus, pas besoin de caster ton pointeur (mais c'est très propre de le faire)

5) Tu lis une trame sur ta socket (moi j'utilise "read" mais "recv" marche aussi) mais es-tu certain que ta trame contienne bien le "0" final utilisé par "printf" et "strlen" ?

Je pense cependant que ton source est bon et que ton serveur doit marcher. Mais ce n'est pas la peine de mettre "5" dans le "listen", "1" doit suffire puisque tu n'attends apparemment qu'un seul client...

Re: include
Auteur: bloodaxe (IP enregistrée)
Date: le 14 février 2004 à 21:07

toujours un probleme sur la ligne accept(sock, &adr_client, &lg_addr);

socket.cpp:75: error: invalid conversion from `int*' to `socklen_t*'

j'ai beau mettre (struct sockaddrin *) pour le 2 parametre c pareil

Re: include
Auteur: svear (IP enregistrée)
Date: le 14 février 2004 à 22:06

Le "int*" c'est le 3° paramètre "&lg_addr"
Vérifie bien dans le "man accept" quel est le type de ce 3° paramètre !!!

Sous unix, il est "int*" alors tu définis une variable "lg" de type int et ça marche.

Apparemment, sous Linux, c'est une variable de type "socklen_t*"

Il est fortement probable que ce type "socklen_t" soit une redéfinition du type "int" mais essaye d'aller voir dans "sys/types.h" et/ou "sys/socket.h" pour en être certain.

De toute façon le compilo veut un ptr de type "socklen_t" alors tu te fais pas c..., tu définis une variable "socklen_t var" et tu appelles
accept(sock, &adr_client, &var);

Ensuite, ça devrait aller !

Re: include
Auteur: svear (IP enregistrée)
Date: le 14 février 2004 à 22:08

De toute façon, les deux derniers paramètres de "accept" sont destinés à recevoir
- l'adresse du client qui se connecte
- la longueur en octet de cette adresse
Si tu n'as pas besoin de ces infos, tu peux remplacer ces deux paramètres par "NULL"
accept(sock, NULL, NULL);

Re: include
Auteur: Nico__ (IP enregistrée)
Date: le 15 février 2004 à 10:13

quand il se palit pour le sockaddr_in au lieu de sockaddr fait un cast vers un void * pour le faire taire.

A noter que sous linux l'ordre des include n'a pas d'importance, par contre sous BSD si.

Re: include
Auteur: svear (IP enregistrée)
Date: le 15 février 2004 à 10:41

Encore un petit truc:
Sur ton serveur, tu n'es pas obligé d'aller chercher l'adresse de "localhost" pour le stocker dans "sockname.sin_addr.s_addr", tu peux y mettre directement la constante INADDR_ANY



Nom du forum : (antispam) - (en développement:saisir un texte pour le message, rempli cette zone automatiquement)
Votre nom: 
Votre email: 
Sujet: 

 
Ce forum est boosté par Phorum.