Rechercher : dans
Par :

Utilisation de socket.h C++ sous Unix/Linux

Dernière réponse le 2 avr 2007 à 02:30:31 Flagg, le 13 jun 2002 à 15:50:51 
 Signaler ce message aux modérateurs

Quelqu'un pourrait-il me donner un exemple simple, commenté si possible, d'un programme utilisant socket.h (du genre envoyer ou recevoir du texte d'un autre pc en type client/serveur) ?

Merci d'avance

Meilleures réponses pour « Utilisation de socket.h C++ sous Unix/Linux » dans :
Compiler du C sous Linux/UNIX Voir Sous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
[Linux] Utiliser la commande 'su' VoirPréambule Se connecter sous un autre ID utilisateur avec "su" Démarrer un nouveau shell de connexion avec "su -" Revenir au shell précédent Suspendre le shell du compte root Notes Préambule La commande "su" (Switch User, appelée plus...
Unix et Linux: Un héritage VoirLes différents Linux et Unix ne sont pas apparus par génération spontanée: Ils sont généralement dérivés d'autres Unix/Linux. Voir un résumé de l'héritage des distributions majeures: (Schéma réalisé avec le logiciel opensource yEd) Note Ce...
Pourquoi Windows ne voit pas les 4 Go de RAM installés ? VoirWindows XP ou Vista en édition 32 bits ne peuvent pas utiliser 4 Go, il n'y a rien à faire, c'est une limitation mathématique. En 32 bits, le système ne peut adresser que : 2 puissance 32 = 4,3 Milliards d'adresses différentes , correspondant...
Programmation réseau - Les sockets VoirIntroduction aux sockets La notion de sockets a été introduite dans les distributions de Berkeley (un fameux système de type UNIX, dont beaucoup de distributions actuelles utilisent des morceaux de code), c'est la raison pour laquelle on parle...
Les fonctions de l'API Socket VoirLes fonctions des sockets en détail La fonction socket() La création d'un socket se fait grâce à la fonction socket() : int socket(famille,type,protocole) famille représente la famille de protocole utilisé (AF_INET pour TCP/IP utilisant une...
Linux - Gestion des utilisateurs VoirPremier pas de l'administrateur Lorsque diverses personnes ont accès à un système, il est nécessaire que l'administrateur système gère les utilisateurs. Pour ceci, les commandes usuelles et les fichiers à configurer doivent être connus. Les...

1

flagg, le 18 jun 2002 à 08:28:46
  • +4

Ben voilà j'ai mon code source serveur :

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <strings.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>



#define PORT 12345
char msg[]=
"\t\t\tReponse\n"


#define YES 1
#define NO 0


int main(int argc, char *argv[])
{
int sockfd, newfd, size;
struct sockaddr_in local;
struct sockaddr_in remote;

bzero(&local, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(PORT);
local.sin_addr.s_addr = INADDR_ANY;
bzero(&(local.sin_zero), 8);

if((sockfd=socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
if(bind(sockfd, (struct sockaddr *)&local, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
if(listen(sockfd, 5) == -1)
{
perror("listen");
exit(1);
}
size = sizeof(struct sockaddr_in);

while(1)
{
if((newfd=accept(sockfd, (struct sockaddr *)&remote, &size)) == -1)
{
perror("accept");
exit(1);
}


if (!fork())
{
send(newfd,msg,sizeof(msg), 0);



close(0);
close(newfd);
}
}

return(0);
}


Et mon code source client :

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

#define _SERV "127.0.0.1" //l'IP du serveur, par forcément 127.0.0.1
#define _PORT 12345

int main(int argc, char *argv[])
{
int port,s;
struct sockaddr_in serv_addr;
struct hostent *server;

port = _PORT;
server = gethostbyname(_SERV);
if (!server)
{
fprintf(stderr, "Impossible de résoudre \"%s\"", _SERV);
return 1;
}
s = socket(AF_INET, SOCK_STREAM, 0);
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy(server->h_addr, &serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(port);

if (connect(s, &serv_addr, sizeof(serv_addr)) < 0)
{
perror("Impossible de se connecter à l'adresse");
return 1;
}
return 0;
}

PB : ça plante toujours au connect, ça me dit Connection refused :(

D'où ça vient ??

Répondre à flagg

2

leprechaun, le 18 jun 2002 à 21:31:36

Bonsoir flag,
__ C'est beau le C

1_ tu utilise 'gethostbyname(_SERV);' alors que ds ta structure de prg tu devrais plus utiliser: gethostname(_SERV);' , et ajouté au debut du prog: #define _SERV "localhost"

2_ Je crois que tu oublies aussi de preciser l'adresse IP de ton srv:
remplace la ligne
bcopy(server->h_addr, &serv_addr.sin_addr.s_addr, server->h_length);
par
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

3_ Ds ton connect cast ton 2nd parametre avec 'struct_sockaddr'

4_ Tu oublies de fermer 's'

Peut etre que ces changements pourront t'aider:
#define _SERV "localhost" //l'IP du serveur, par forcément 127.0.0.1
#define _PORT 12345


int main(int argc, char *argv[])
{
int port,s;
struct sockaddr_in serv_addr;
struct hostent *server;

port = _PORT;
server = gethostbyname(_SERV);

if (!server)
{
fprintf(stderr, "Hote inconnu: \"%s\"", _SERV);
exit(1);
}
s = socket(AF_INET, SOCK_STREAM, 0);

bzero(&serv_addr, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(port);

if (connect(s, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0)
{
perror("Impossible de se connecter à l'adresse");
exit(1);
}
close(s);
exit(0);
}




TIENS MOI AU COURANT

Un jour je serai Castor a la place de Castor!!!
Good Luck

Répondre à leprechaun

3

leprechaun, le 18 jun 2002 à 21:34:59

ERRATUM

Ds le nouveau source, vous aurez evidemment corrigé vous meme:
Il ne fallait pas lire
server = gethostbyname(_SERV);
mais bien
server = gethostname(_SERV);

Un jour je serai Castor a la place de Castor!!!
Good Luck

Répondre à leprechaun

4

leprechaun, le 18 jun 2002 à 21:41:40

En fait en y regardant de tres pres je crois qu'il y'a pas mal d'erreur ds mon code (meme de loin d'ailleurs:-)).
A moins qu'il y'est juste eu un melange de genre...

en faite je n'ais pas utilisé la structure hostent alors que j'aurais du.
Mais je crois me souvenir que le bzero et bcopy ne fonctionnait pas bien.

Desolé de ne pouvoir t'aider plus :{ BooooooH

TIENS moi au courant de tes modifs

Un jour je serai Castor a la place de Castor!!!
Good Luck

Répondre à leprechaun

5

Mildred, le 23 mar 2004 à 00:33:17

Merci beaucoup ...
Je cherchais déséspérément un exemple.
Voici le code de mon serveur (client=`telnet localhost 59300`)

serv.c
====#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>

#include <errno.h>
#include <strings.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

#include "config.c"

int main(int argc, char *argv[])
{
int sockfd, newfd, size, count_req, t;
struct sockaddr_in local;
struct sockaddr_in remote;

bzero(&local, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons( PORT );
local.sin_addr.s_addr = INADDR_ANY;
bzero(&(local.sin_zero), 8);

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR)
{
fprintf(stderr, "Socket creation error\n");
return EXIT_FAILURE;
}
if(bind(sockfd, (struct sockaddr *)&local, sizeof(struct sockaddr)) == SOCKET_ERROR)
{
fprintf(stderr, "Can't link socket\n");
return EXIT_FAILURE;
}
if(listen(sockfd, BACKLOG) == SOCKET_ERROR)
{
fprintf(stderr, "Can't listen\n");
return EXIT_FAILURE;
}
size = sizeof(struct sockaddr_in);
for(count_req = 0; count_req <= MAX_REQ; count_req++)
{
if((t = accept(sockfd, (struct sockaddr *)&remote, &size)) == SOCKET_ERROR)
{
fprintf(stderr, "Can't accept\n");
return EXIT_FAILURE;
}
send(t, "Bienvenue", sizeof("Bienvenue"), 0);
}
close(newfd);
return EXIT_SUCCESS;
}

config.c
======
#define PORT 59300
#define BACKLOG 100
#define MAX_REQ 100
#define YES 1
#define NO 0

#define SOCKET_ERROR -1

Répondre à Mildred

6

Ssou, le 1 avr 2007 à 02:21:49

Aaaaaaaaaaaa que voi-je ! horreur, ne jamais inclure un fichier ".c"! les headers existe pour sa !

Répondre à Ssou

7

 Mildred, le 2 avr 2007 à 02:30:31

Ca fait un bout de temps que j'ai posté ici, je ne me souviens plus de ce bout de code.

Enfin, si tu regardes le fichier config.c, c'est pareil qu'un header (que des #define) dedans, alors ce n'est pas très gênant. Par contre, c'est vrai que j'aurais du le nommer plutôt config.h...

Répondre à Mildred