begin process at 2012 02 13 00:42:10
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > SQUELETTE DE COMMUNICATION PAR SOCKET EN MODE CONNECTÉ POUR LINUX

SQUELETTE DE COMMUNICATION PAR SOCKET EN MODE CONNECTÉ POUR LINUX


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Classé sous :linux, socket, tcp Niveau :Initié Date de création :27/05/2006 Date de mise à jour :27/05/2006 17:22:54 Vu / téléchargé :8 171 / 405

Auteur : AlexN

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note


 Description

Un simple exemple de programme en trois fichiers.

myinet.h est un include commun pour les deux programmes
afinettcpe.c est l'émetteur
afinettcpr.c est le recepteur

Compiler chaque partie :

cc afinettcpe.c -o e
cc afinettcpr.c -o r

Lancer d'abord le récépteur, en arrière plan :
r 2 &
Lancer l'emetteur :
e localhost 2

Control-C pour arrêter.

Source

  • //
  • // Fichier myinet.h
  • //
  • #define MYCORPS 16
  • struct mymsg {
  • uint32_t entete;
  • char corps[MYCORPS];
  • };
  • #define BACKLOG 64
  • //
  • // Fichier afinettcpe.c
  • //
  • #include <sys/types.h>
  • #include <sys/socket.h>
  • #include <netinet/in.h>
  • #include <netdb.h>
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include "myinet.h"
  • main (int argc, char *argv[]) {
  • struct hostent *phost;
  • int sockfd;
  • struct sockaddr_in serv_addr;
  • int cpt = 0;
  • struct mymsg msg;
  • int ret_send;
  • if (argc < 3) {
  • fprintf(stderr, "USAGE : afinettcpe machine_cible port_cible\n");
  • exit (EXIT_FAILURE);
  • }
  • phost = gethostbyname(argv[1]);
  • if (phost == NULL) {
  • fprintf(stderr, "Incident gethostbyname(\"%s\"p)", argv[1]);
  • }
  • sockfd = socket(AF_INET, SOCK_STREAM, 0);
  • if (sockfd == -1) { perror("socket()"); exit (EXIT_FAILURE); }
  • /* pour le client un bind est fait automatiquement lors du connect() */
  • memset(&serv_addr, '\0', sizeof(serv_addr));
  • serv_addr.sin_family = AF_INET;
  • serv_addr.sin_port = htons((uint16_t)atoi(argv[2]));
  • memcpy(&serv_addr.sin_addr, phost->h_addr, phost->h_length);
  • if (connect (sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1 ) { perror ("connect()"); exit(EXIT_FAILURE); }
  • while (++cpt) {
  • msg.entete = htonl((uint32_t)cpt);
  • strcpy (msg.corps, "Pour voir");
  • ret_send = send(sockfd, &msg, sizeof(msg), 0);
  • if (ret_send == -1) { perror ("send()\n"); exit(EXIT_FAILURE); }
  • sleep(1);
  • }
  • }
  • //
  • // Fichier afinettcpr.c
  • //
  • #include <sys/types.h>
  • #include <sys/socket.h>
  • #include <netinet/in.h>
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include "myinet.h"
  • main (int argc, char *argv[]) {
  • int sockfd, socksrvfd;
  • struct sockaddr_in my_addr, name, from;
  • int fromlen;
  • struct mymsg msg;
  • int ret_recv;
  • int cpt = 0, i, j;
  • if (argc < 2) { fprintf(stderr, "Usage : afinettcpr port_reception\n"); exit (EXIT_FAILURE);}
  • /* Acquisition d'un descripteur de socket. */
  • sockfd = socket(AF_INET, SOCK_STREAM, 0);
  • if (sockfd == -1) { perror("socket()"); exit (EXIT_FAILURE); }
  • /* assignation d'une adresse à la socket */
  • memset(&my_addr, '\0', sizeof(my_addr));
  • my_addr.sin_family = AF_INET;
  • my_addr.sin_port = htons((uint16_t)atoi(argv[1]));
  • my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  • if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) == -1) { perror("bind()"); exit(EXIT_FAILURE); }
  • if (listen(sockfd, BACKLOG) == -1) { perror("listen()"); exit(EXIT_FAILURE); }
  • /* socket de service */
  • fromlen = sizeof(from);
  • memset(&from, '\0', sizeof(from));
  • ecoute:
  • socksrvfd = accept(sockfd, (struct sockaddr*)&from, &fromlen);
  • if (socksrvfd == -1) { perror ("accept()"); exit(EXIT_FAILURE); }
  • /* qui a émis */
  • printf("fromlen : %d ", fromlen);
  • printf("sin_family : %d ", from.sin_family);
  • printf("sin_port : %d ", from.sin_port);
  • printf("sin_addr : %d ", inet_ntoa(from.sin_addr));
  • printf("\n");
  • printf("Entrée dans la boucle de reception\n");
  • while (++cpt) {
  • /* lecture d'un message */
  • ret_recv = recv(socksrvfd, &msg, sizeof(msg), 0);
  • if (ret_recv == 0) goto ecoute;
  • if (ret_recv == -1) { perror("recv()"); exit (EXIT_FAILURE); }
  • /* message reçu */
  • printf("cpt_serveur %d : ", cpt);
  • printf("message %d - %s ",(int)ntohl(msg.entete), msg.corps);
  • printf("\n");
  • }
  • }
//
// Fichier myinet.h
//

#define MYCORPS 16
struct mymsg {
	uint32_t entete;
	char corps[MYCORPS];
};

#define BACKLOG 64

//
// Fichier afinettcpe.c
//

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include "myinet.h"

main (int argc, char *argv[]) {

	struct hostent *phost;
	int sockfd;
	struct sockaddr_in serv_addr;
	int cpt = 0;
	struct mymsg msg;
	int ret_send;
	if (argc < 3) {
		fprintf(stderr, "USAGE : afinettcpe machine_cible port_cible\n");
		exit (EXIT_FAILURE);
	}
	phost = gethostbyname(argv[1]);
	if (phost == NULL) { 
		fprintf(stderr, "Incident gethostbyname(\"%s\"p)", argv[1]);
	}

	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (sockfd == -1) { perror("socket()"); exit (EXIT_FAILURE); }

	/* pour le client un bind est fait automatiquement lors du connect() */
	memset(&serv_addr, '\0', sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons((uint16_t)atoi(argv[2]));
	memcpy(&serv_addr.sin_addr, phost->h_addr, phost->h_length);
	if (connect (sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1 ) { perror ("connect()"); exit(EXIT_FAILURE); }

	while (++cpt) {
		msg.entete = htonl((uint32_t)cpt);
		strcpy (msg.corps, "Pour voir");
		ret_send = send(sockfd, &msg, sizeof(msg), 0);
		if (ret_send == -1) { perror ("send()\n"); exit(EXIT_FAILURE); }
		sleep(1);
	}  
}

//
// Fichier afinettcpr.c
//

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include "myinet.h"

main (int argc, char *argv[]) {

	int sockfd, socksrvfd;
	struct sockaddr_in my_addr, name, from;
	int fromlen;
	struct mymsg msg;
	int ret_recv;
	int cpt = 0, i, j;

	if (argc < 2) { fprintf(stderr, "Usage : afinettcpr port_reception\n"); exit (EXIT_FAILURE);}

	/* Acquisition d'un descripteur de socket. */
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (sockfd == -1) { perror("socket()"); exit (EXIT_FAILURE); }

	/* assignation d'une adresse à la socket */
	memset(&my_addr, '\0', sizeof(my_addr));
	my_addr.sin_family = AF_INET;
	my_addr.sin_port = htons((uint16_t)atoi(argv[1]));
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) == -1) { perror("bind()"); exit(EXIT_FAILURE); }
	if (listen(sockfd, BACKLOG) == -1) { perror("listen()"); exit(EXIT_FAILURE); }

	/* socket de service */
	fromlen = sizeof(from);
	memset(&from, '\0', sizeof(from));

	ecoute:
	socksrvfd = accept(sockfd, (struct sockaddr*)&from, &fromlen);
	if (socksrvfd == -1) { perror ("accept()"); exit(EXIT_FAILURE); }
	/* qui a émis */
	printf("fromlen : %d ", fromlen);
	printf("sin_family : %d ", from.sin_family);
	printf("sin_port : %d ", from.sin_port);
	printf("sin_addr : %d ", inet_ntoa(from.sin_addr));
	printf("\n");
	printf("Entrée dans la boucle de reception\n");
	while (++cpt) {
		/* lecture d'un message */
		ret_recv = recv(socksrvfd, &msg, sizeof(msg), 0);
		if (ret_recv == 0) goto ecoute;
		if (ret_recv == -1) { perror("recv()"); exit (EXIT_FAILURE); }
		/* message reçu */
		printf("cpt_serveur %d : ", cpt);
		printf("message %d - %s ",(int)ntohl(msg.entete), msg.corps);
		printf("\n");
	}  
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

27 mai 2006 17:22:54 :
Correction de quelques fautes de frappes et ajout des sources pour plus de lisibilité.

 Sources du même auteur

GÉNÉRATION D'UNE LISTE DES COMBINAISONS SANS RÉPÉTITION D'ÉL...
Source avec Zip COMMUNICATION INTER PROCESSUS PAR IPC SOUS *NIX
TRI PAR INSERTION AVEC SENTINELLE
GÉNÉRATION D'UNE PERMUTATION ALÉATOIRE, SANS RETIRAGE

 Sources de la même categorie

Source avec Zip Source avec une capture TRACEROUTE [WINPCAP] par ganjarasta
Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas
Source avec Zip Source avec une capture SECURE REMOTE SHELL [WIN32] par ganjarasta
Source avec Zip Source avec une capture SUIVI DE PRODUCTION ONDULEUR PHOTOVOLTAÏQUE SOLARMAX par brunovan
Source avec Zip MINICHAT MULTI-CLIENT par wisar

 Sources en rapport avec celle ci

Source avec Zip SERVEUR/CLIENT LINUX par ghost4
REMOTE POST PHP WITH SOCKET LINUX par 0x0syscall
Source avec Zip LIBCONNECT - BIBLIOTHÈQUE C++ DE CONNEXION par turnerom
Source avec Zip Source avec une capture POPUX PETIT CLIENT POP3 POUR POSIX par xtremejames183
Source avec Zip MK_SOCKET : UNE BIBLIOTHÈQUE COMPLÈTE ET TRÈS SIMPLE DE GEST... par dnob700

Commentaires et avis

Commentaire de carnibal le 21/04/2008 21:45:18

J'ai une erreur au lancement de r :
bind(): Permission denied

Commentaire de AlexN le 24/04/2008 09:46:32

Bonjour,

C'est un problème de configuration de ton réseau.
N'ayant aucune information sur le contexte d'exécution que tu as utilisé (système d'exploitation, commande de lancement du programme, etc.), et comme je ne suis pas devin, je ferais la supposition suivante : tu as lancé le récepteur avec en argument un numéro de port que la configuration de ton réseau n'autorise pas.

Il faut :
- soit utiliser un numéro de port autorisé par ta configuration réseau,
- soit modifier la configuration de ton firewall pour autoriser le numéro de port que tu as utilisé

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

TCP/IP [C++ Linux G++] Pas encore poste (?) [ par Niko2012 ] Bon, je suis en train de m'initier au tcp/ip sous linux et j'en bave...je recherche:-de bon tutoriels (si vous en connaissez en francais c mieux)-des Socket TCP/UDP [ par hobbes ] Bonjour,j ai cru comprendre qu il existe 2 types de sockets (TCP et UDP) pouvant permettre l echange de donnees entre 2 applications sur le reseau.Pou Raw Socket -> TCP/IP [ par krum ] Voila plus d'une semaine que je fouille/cherche sur les moteurs de recherches,les forums ..des sources,des tutos,des papers sur les raw sockets (sous Problème de socket UDP sous linux [ par RaygKross ] Salut à tousMon problème est je dois créer un programme manager snmpLes port de SNMP sont 161 et 162J'initialise ma structure de type sockaddr_in avec socket raw sous linux [ par gpg ] quelqu'un aurait-il un petit exemple de programmation de socket raw sous linux SANS librairies additionelle (C/C++ brut) Problème fermeture socket [ par alexixlebaulois ] Salut,Je suis en train de créer une appli qui communique avec plusieurs serveurs pour récupérer leur état. Toutes les communications se font en même t socket tcp/ip en C [ par ravat485 ] qui peut m'aider par un exemple d'utilisation de socket en C (TCP/IP),pour envoyer des donnees??? programmation socket sous linux [ par blazman34 ] Bonjour à tous !!Voici mon probleme :Je suis en train de programmer une application client serveur sous linux, tout a bien marcher juska présent juska Linux, C & Sockets [ par cbismuth ] Bonjour! Je pense devenir fou...Je programme actuellement une architecture serveur/client en C.Le problème est que pour tous les clients qui se conne faire un timeout avec une socket TCP sur un connect() [ par bobijoe ] Salut tout le monde,ca fait pas mal de temps que je me lutte pour faire un timeout sur une demande de connexion TCP.En clair je voudrais pouvoir arret


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,498 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales