0% ont trouvé ce document utile (0 vote)
121 vues4 pages

Communication par Socket en C

Le document présente des exercices sur la communication par socket en C, incluant des exemples de création et de liaison de sockets en mode UDP. Il détaille également la mise en place d'une communication unidirectionnelle et bidirectionnelle entre un client et un serveur. Des instructions sont fournies pour observer les sockets créées à l'aide de la commande netstat.

Transféré par

Dkfk Hdjd
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
121 vues4 pages

Communication par Socket en C

Le document présente des exercices sur la communication par socket en C, incluant des exemples de création et de liaison de sockets en mode UDP. Il détaille également la mise en place d'une communication unidirectionnelle et bidirectionnelle entre un client et un serveur. Des instructions sont fournies pour observer les sockets créées à l'aide de la commande netstat.

Transféré par

Dkfk Hdjd
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

TD Programmation Système Série 7

Correction : Communication par Socket

Exercice 1 : Test de socket


1.
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include<string.h>
#include<sys/un.h>
#include<stdlib.h>

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


{
int ids;
struct sockaddr_un adr;

ids= socket(AF_UNIX,SOCK_DGRAM,0);
if(ids==-1){
perror("socket");
exit(0);}

printf("Identificateur de la socket : %d \n", ids);

close(ids);
return 0;
}

2.
int main(int argc,char* argv[])
{
int ids,idb;
struct sockaddr_un adresse;

ids= socket(AF_UNIX,SOCK_DGRAM,0);

if(ids==-1){
perror("socket");
exit(0);}

/* Préparation de l'adresse de l'attachement */


adresse.sun_family =AF_UNIX;
strcpy(adresse.sun_path, argv[1]);

idb=bind(ids, (struct sockaddr *)&adresse, sizeof(adresse));


if(idb==-1){
perror("bind");
exit(0);}

close(ids);
return 0;
}
3. Pour pouvoir observer par la commande netstat la socket crée en mode non connecté et son
attachement au fichier passé en paramètre il faut ajouter une boucle infinie après
l’attachement de la socket au fichier passé en paramètre.
a.
int main(int argc,char* argv[])
{
int ids,idb;
struct sockaddr_un adresse;

ids= socket(AF_UNIX,SOCK_DGRAM,0);
if(ids==-1){
perror("socket");
exit(0);}

printf("Identificateur de la socket : %d \n", ids);

/* Préparation de l'adresse de l'attachement */


adresse.sun_family =AF_UNIX;
strcpy(adresse.sun_path, argv[1]);

idb=bind(ids, (struct sockaddr *)&adresse, sizeof(adresse));


if(idb==-1){
perror("bind");
exit(0);}

while(1) ; // créer une boucle infinie

close(ids);
return 0;
}

b. Lancer l’exécution avec le fichier /tmp/test (./excutable /tmp/test )


Exécuté la commande netstat :
Connexions Internet actives (sans serveurs)
Proto Recv-Q Send-Q Adresse locale Adresse distante Etat
Sockets du domaine UNIX actives(sans serveurs)
Proto RefCnt Flags Type State I-Node Chemin
unix 7 [] DGRAM 4889 /dev/log
unix 2 [] DGRAM 2279 @/org/kernel/udev/udevd
unix 2 [] DGRAM 5458 @/org/freedesktop/hal/udev_event
unix 2 [] DGRAM 7956 /tmp/test
unix 3 [] STREAM CONNECTE 7787 /tmp/ksocket-mohammed/konqueror33Jylc.slave-
socket
unix 3 [] STREAM CONNECTE 7786
unix 3 [] STREAM CONNECTE 7770 /tmp/.ICE-unix/2324
unix 3 [] STREAM CONNECTE 7769
unix 3 [] STREAM CONNECTE 7768 /tmp/.X11-unix/X0
unix 3 [] STREAM CONNECTE 7767
unix 3 [] STREAM CONNECTE 7762 /tmp/.ICE-unix/dcop2313-1464877830
unix 3 [] STREAM CONNECTE 7761
unix 3 [] STREAM CONNECTE 7754 /tmp/ksocket-mohammed/kwritecs8Tya.slave-socket
unix 3 [] STREAM CONNECTE 7753
unix 3 [] STREAM CONNECTE 7727 /tmp/ksocket-mohammed/klauncher3Y5NSa.slave-
socket
unix 3 [] STREAM CONNECTE 7726
unix 3 [] STREAM CONNECTE 7552 /tmp/.famqeGm5n
unix 3 [] STREAM CONNECTE 7551
unix 3 [] STREAM CONNECTE 7544 /tmp/.ICE-unix/dcop2313-1464877830
unix 3 [] STREAM CONNECTE 7543
Exercice 2 : communication interprocessus par socket

1. Communication en mode UDP unidirectionnelle

Processus Client Processus Serveur

#include<stdio.h> #include<stdio.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include<string.h> #include<string.h>
#include<sys/un.h> #include<sys/un.h>
#include<stdlib.h> #include<stdlib.h>
#include <ctype.h>
int main(int argc,char* argv[])
{
int ids,idb; int main(int argc,char* argv[])
struct sockaddr_un adresseS; {
char c; int ids,idb;
struct sockaddr_un adresseS, adresseC;
ids= socket(AF_UNIX,SOCK_DGRAM,0); char c;
if(ids==-1){
perror("socket"); ids= socket(AF_UNIX,SOCK_DGRAM,0);
exit(0);} if(ids==-1){
perror("socket");
/* Préparation de l'adresse du Processus exit(0);}
Serveur pour Envoi*/

adresseS.sun_family =AF_UNIX; /* Préparation de l'adresse du Processus


strcpy(adresseS.sun_path, argv[1]); Serveur pour Attachement*/
adresseS.sun_family =AF_UNIX;
c=getchar(); strcpy(adresseS.sun_path, argv[1]);

sendto(ids, &c, sizeof(char), 0, (struct sockaddr *) idb= bind(ids, (struct sockaddr *) &adresseS,
&adresseS,sizeof(adresseS)); sizeof(adresseS));
if(idb==-1){
close(ids); perror("bind");
return 0; exit(0);}

} /* adresseC adresse de l'expéditeur */


recvfrom(ids, &c, sizeof(char), 0, (struct sockaddr
*) &adresseC,(socklen_t*)sizeof(adresseC));

printf("caractère reçu :%c\n", toupper(c));


close(ids);
return 0;

}
2. Communication en mode UDP bidirectionnelle

Processus Client Processus Serveur

#include<stdio.h> #include<stdio.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include<string.h> #include<string.h>
#include<sys/un.h> #include<sys/un.h>
#include<stdlib.h> #include<stdlib.h>
#include <ctype.h>
int main(int argc,char* argv[])
{
int ids,idb; int main(int argc,char* argv[])
struct sockaddr_un adresseC, adresseS; {
char c; int ids,idb;
struct sockaddr_un adresseS, adresseC;
ids= socket(AF_UNIX,SOCK_DGRAM,0); char c;
if(ids==-1){
perror("socket"); ids= socket(AF_UNIX,SOCK_DGRAM,0);
exit(0);}
if(ids==-1){
/* Préparation de l'adresse du Processus Client perror("socket");
pour Attachement*/ exit(0);}
adresseC.sun_family =AF_UNIX;
strcpy(adresseC.sun_path, argv[1]);
/* Préparation de l'adresse du Processus
idb=bind(ids, (struct sockaddr *) &adresseC, Serveur pour Attachement*/
sizeof(adresseC)); adresseS.sun_family =AF_UNIX;
if(idb==-1){ strcpy(adresseS.sun_path, argv[1]);
perror("bind");
exit(0);} idb=bind(ids, (struct sockaddr *) &adresseS,
sizeof(adresseS));
/* Préparation de l'adresse du Processus if(idb==-1){
Serveur pour Envoi*/ perror("bind");
adresseS.sun_family =AF_UNIX; exit(0);}
strcpy(adresseS.sun_path, argv[2]);
/* adresseC adresse de l'expéditeur */
/* Communication Bidirectionnelle */ int taille=sizeof(adresseS);
c=getchar();
sendto(ids, &c, sizeof(char), 0, (struct sockaddr *) recvfrom(ids, &c, sizeof(char), 0, (struct sockaddr
&adresseS,sizeof(adresseS)); *) &adresseC,(socklen_t*) &taille);

recvfrom(ids, &c, sizeof(char), 0, (struct sockaddr c=toupper(c);


*) &adresseS,(socklen_t*)sizeof(adresseS)); printf("caractère reçu :%c\n", c);

printf("caractère reçu :%c\n", c); sendto(ids, &c, sizeof(char), 0, (struct sockaddr *)


close(ids); &adresseC,taille);
return 0;
close(ids);
} return 0;

Vous aimerez peut-être aussi