Création
d'entreprise
Posez votre question Signaler

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

Flagg - Dernière réponse le 11 janv. 2011 à 16:19
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
Lire la suite 

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

13 réponses
Réponse
+7
moins plus
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 ??
leprechaun- 18 juin 2002 à 21:34
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
khawarzmi - 10 déc. 2010 à 21:55
le probleme se reside au niveau de choix de Port , verfier que le client et le serveur soient connecter au meme Port
tonmaitre - 11 janv. 2011 à 16:19
ouvre le port 12345
Ajouter un commentaire
Réponse
+2
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
Aaaaaaaaaaaa que voi-je ! horreur, ne jamais inclure un fichier ".c"! les headers existe pour sa !
Mildred - 2 avril 2007 à 02:30
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...
Ajouter un commentaire
Réponse
+0
moins plus
re les amis je suis sous windows .

je debute en programmation est j ai dev c ++ est codcebloks .

je prend condole aplication .

je rentre le code donnée precedement et j ai des erreur de compil .

ceci avec tout les socket . ++
Ajouter un commentaire
Réponse
+0
moins plus
re les amis je suis sous windows .

je debute en programmation est j ai dev c ++ est codcebloks .

je prend condole aplication .

je rentre le code donnée precedement et j ai des erreur de compil .

ceci avec tout les socket . ++
Fred - 1 févr. 2010 à 14:30
C'est normal le code donné plus ne peut pas fonctionner sous windows, du fait de certains includes associés au début du code

Cet include par exemple est uniquement disponible sous unix/linux.

#include <sys/socket.h>


Si tu veux vraiment utiliser les sockets sous windows, tu peux utiliser la librairie "winsock", mais tu devras apporter des modifications dans le code pour obtenir le même résultat.


Cordialement

Fred
oli7350- 15 nov. 2010 à 14:12
Merci beaucoup pour ta réponse , et désolé pour les phautes d'orthographe , ..
Ajouter un commentaire
Ce document intitulé « Utilisation de socket.h C++ sous Unix/Linux » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?