Accueil > > > PROTOCOLE TCP/IP - CLIENT/SERVEUR - [C++] [GCC]
PROTOCOLE TCP/IP - CLIENT/SERVEUR - [C++] [GCC]
Information sur la source
Description
Une fois le serveur lance, un client peut s'y connecter via TCP, le serveur lui renvoit l'heure courante et le client l'affiche. Le client prend comme argument l'ip du serveur. Si vous avez des remarques, des questions, des suggestions, elles sont bienvenues !
Source
- ///////////////////////// Client tcp - by Nik^o^ - ////////////////////////////
-
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <sys/un.h>
- #include <stdio.h>
-
- #define MAXLINE 4096
- #define MASOCKET 13
- //socket habituellement utilise pour un daytime serveur
- //si l'acces est refuse, essayer avec un socket > 1023 (ex: 1111)
-
-
- int
- main(int argc, char **argv)
- {
- int sockfd, n;
- char recvline[MAXLINE + 1];
- struct sockaddr_in servaddr;
-
- if (argc != 2){
- perror("usage: a.out <IPaddress>");
- exit(1);
- //si le nombre de parametres n'est pas correct...
-
- }
-
- if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
- //la fonction socket cree un socket de flux (SOCK_STREAM)internet(AF_INET)
- //(incomprehensible en francais)(plus simplement : Internet stream socket).
- //Renvoit un int pour identifier le socket plus tard (cf. read & connect)
-
- perror("socket error");
- exit(1);
- //si ca foire...
- }
-
- bzero(&servaddr, sizeof(servaddr));
- //on met toute la structure a 0
- //on remplit la structure avec l'ip du serveur et le num de son port
-
- servaddr.sin_family = AF_INET;
- servaddr.sin_port = htons(MASOCKET);
- //htons: pour convertir le numero de port
-
- if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
- //inet_pton: convertit l'argument ASCII (Ex: 127.0.0.1) dans le bon format
-
- perror("inet_pton error");
- exit(1);
- //de meme, si ca foire...
- }
-
- if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){
- //connect etablit la connection TCP avec le serveur specifie par la structure de
- //l'adresse du socket pointe par le second argument
-
- perror("connect error");
- exit(1);
- //idem
- }
-
- while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
- //lit la reponse du serveur et ecrit le resultat
-
- recvline[n] = 0;
- //null terminate
-
- if (fputs(recvline, stdout) == EOF){
- perror("fputs error");
- exit(1);
- }
- }
-
- if (n < 0){
- //s'il y a eu un probleme pendant la lecture...
- perror("read error");
- exit(1);
- }
-
- exit(0);
- }
-
-
- ///////////////////////// Serveur tcp - by Nik^o^ - ////////////////////////////
-
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <sys/un.h>
- #include <stdio.h>
-
- #define MAXLINE 4096
- #define MASOCKET 13
-
- int
- main(int argc, char **argv)
- {
- int listenfd, connfd;
- struct sockaddr_in servaddr;
- char buff[MAXLINE];
- time_t tics;
-
- if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
- //meme chose que pour le client
-
- perror("socket error");
- exit(1);
- //et si ca foire !
-
- }
-
- bzero(&servaddr, sizeof(servaddr));
- //meme chose que pour le client
-
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- //INADDR_ANY signifie que le serveur va accepter une connection
- //client sur n'importe-quelle interface
-
- servaddr.sin_port = htons(MASOCKET);
-
- //on lie le port du serveur au socket en remplissant la "internet socket
- //adresse structure" et en appellant bind
- if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){
- perror("bind error");
- exit(1);
- //au cas ou...
- }
-
- if (listen(listenfd, 5) < 0){
- //avec listen, le socket est converti en listening socket (ecoute)
- //sur lequel les demandes de connections vont etre acceptees par le Kernel
-
- perror("listen error");
- exit(1);
- //ca peut merder aussi ici
- }
-
- while (1){ //boucle infinie, faut-il le preciser ? :oD
- if ( (connfd = accept(listenfd, (struct sockaddr *) NULL, NULL)) < 0){
- //accept retourne un "descripteur de connection" (connected descriptor) qui est
- //utilise pour la communication avec le nouveau client. Un nouveau pour chaque client
-
- perror("accept error");
- exit(1); //et aussi ici
- }
-
- tics = time(NULL);
- snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&tics));
- //on recupere la date et l'heure
-
- if (write(connfd, buff, strlen(buff)) < 0){
- //et on envoit le tout au client !
-
- perror("write error");
- exit(1); //de meme ;)
- }
-
- close(connfd);
- }
- }
-
///////////////////////// Client tcp - by Nik^o^ - ////////////////////////////
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <stdio.h>
#define MAXLINE 4096
#define MASOCKET 13
//socket habituellement utilise pour un daytime serveur
//si l'acces est refuse, essayer avec un socket > 1023 (ex: 1111)
int
main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 2){
perror("usage: a.out <IPaddress>");
exit(1);
//si le nombre de parametres n'est pas correct...
}
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
//la fonction socket cree un socket de flux (SOCK_STREAM)internet(AF_INET)
//(incomprehensible en francais)(plus simplement : Internet stream socket).
//Renvoit un int pour identifier le socket plus tard (cf. read & connect)
perror("socket error");
exit(1);
//si ca foire...
}
bzero(&servaddr, sizeof(servaddr));
//on met toute la structure a 0
//on remplit la structure avec l'ip du serveur et le num de son port
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(MASOCKET);
//htons: pour convertir le numero de port
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
//inet_pton: convertit l'argument ASCII (Ex: 127.0.0.1) dans le bon format
perror("inet_pton error");
exit(1);
//de meme, si ca foire...
}
if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){
//connect etablit la connection TCP avec le serveur specifie par la structure de
//l'adresse du socket pointe par le second argument
perror("connect error");
exit(1);
//idem
}
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
//lit la reponse du serveur et ecrit le resultat
recvline[n] = 0;
//null terminate
if (fputs(recvline, stdout) == EOF){
perror("fputs error");
exit(1);
}
}
if (n < 0){
//s'il y a eu un probleme pendant la lecture...
perror("read error");
exit(1);
}
exit(0);
}
///////////////////////// Serveur tcp - by Nik^o^ - ////////////////////////////
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <stdio.h>
#define MAXLINE 4096
#define MASOCKET 13
int
main(int argc, char **argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t tics;
if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
//meme chose que pour le client
perror("socket error");
exit(1);
//et si ca foire !
}
bzero(&servaddr, sizeof(servaddr));
//meme chose que pour le client
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//INADDR_ANY signifie que le serveur va accepter une connection
//client sur n'importe-quelle interface
servaddr.sin_port = htons(MASOCKET);
//on lie le port du serveur au socket en remplissant la "internet socket
//adresse structure" et en appellant bind
if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){
perror("bind error");
exit(1);
//au cas ou...
}
if (listen(listenfd, 5) < 0){
//avec listen, le socket est converti en listening socket (ecoute)
//sur lequel les demandes de connections vont etre acceptees par le Kernel
perror("listen error");
exit(1);
//ca peut merder aussi ici
}
while (1){ //boucle infinie, faut-il le preciser ? :oD
if ( (connfd = accept(listenfd, (struct sockaddr *) NULL, NULL)) < 0){
//accept retourne un "descripteur de connection" (connected descriptor) qui est
//utilise pour la communication avec le nouveau client. Un nouveau pour chaque client
perror("accept error");
exit(1); //et aussi ici
}
tics = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&tics));
//on recupere la date et l'heure
if (write(connfd, buff, strlen(buff)) < 0){
//et on envoit le tout au client !
perror("write error");
exit(1); //de meme ;)
}
close(connfd);
}
}
Conclusion
bon, ce code sera mis a jour en fonction de vos remarques. :o)
nouvelle version a venir : serveur en C et applet Java en client
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
[TECHDAYS2012] OUI J'Y SERAI![TECHDAYS2012] OUI J'Y SERAI! par JeremyJeanson
Bonsoir, Certes, je l'annonce avec un peu de retard, mais je serai effectivement au Techdays demain. Comme l'an dernier, je participerai au programme ATE (Ask The Expert). Si vous avez des questions Workflow, WCF, AppFabric ou plus généralement .net, n'hé...
Cliquez pour lire la suite de l'article par JeremyJeanson TFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICESTFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICES par vfabing
Afin de s'assurer du bon fonctionnement des différentes synchronisations effectuées par les TFS Integration Tools, 2 rapports sont présents dès l'installation. Il suffit alors d'effectuer les manipulations suivantes pour pouvoir les visualiser : Loca...
Cliquez pour lire la suite de l'article par vfabing CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks
Forum
RE : ARBRE BINAIRERE : ARBRE BINAIRE par pacotheking
Cliquez pour lire la suite par pacotheking
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|