Socket : Connexion impossible
Bonjour,
Je suis sous mac et linux sous machine virtuelle , et mon programme client ne veut pas fonctionner ..
Quelqu'un saurait me dire d'ou vient le soucis ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
//
// main.cpp
// Projet_Systeme_Client
//
// PARTIE CLIENT //
// ---- Inclusion des fichiers nécéssaires ---- //
#include <iostream>
using namespace std;
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s) // Fonction servant à fermer une socket .
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#include <stdio.h>
#include <stdlib.h>
#define PORT 23
int main(void)
{
int erreur=0;
SOCKET sock;
SOCKADDR_IN sin;
if (!erreur)
{
/* Création de la socket */
sock=socket(AF_INET,SOCK_STREAM,0);
/* Configuration de la connexion */
sin.sin_addr.s_addr=inet_addr("127.0.0.1");
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
/* Si le client arrive à se connecter */
if(connect(sock, (SOCKADDR*) &sin,sizeof(sin)) != SOCKET_ERROR) // Fonciton connect pour établir une connexion du côté client :-)
cout << " Connexion à " << inet_ntoa(sin.sin_addr) << " sur le port " << htons(sin.sin_port);
else
cout << " Impossible de se connecter " << endl;
/* On ferme la socket précédemment ouverte */
closesocket(sock);
}
return EXIT_SUCCESS;
} |
J'espère que vous saurez m'aider , car j'ai beau chercher , je ne trouve pas ..Il m'affiche : " impossible de se connecter " .
----------------------------------------------
De même que le programme serveur , Il m'écrit " bind " , du coup le soucis se situe au niveau du bind .
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| //
// main.cpp
// Projet_Système_Socket
//
// PARTIE SERVEUR //
// ---- Inclusion des fichiers nécéssaires ---- //
#include <iostream>
using namespace std;
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s) // Fonction servant à fermer une socket .
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#include <stdio.h>
#include <stdlib.h>
#define PORT 23
int main(void)
{
int erreur=0;
// Déclaration de la socket . Pour le créer , il faudra utiliser la fonction int socket (...) .
/* Socket et contexte d'adressage du serveur */
SOCKADDR_IN sin;
SOCKET sock;
socklen_t recsize=sizeof(sin);
/* Socket et contexte d'adressage du client */
SOCKADDR_IN csin;
SOCKET csock;
socklen_t crecsize=sizeof(csin);
int sock_err;
if(!erreur)
{
/* Création d'une socket */
sock=socket(AF_INET,SOCK_STREAM,0);
// AF_INET : Domain TCP/IP -- SOCK_STREAM : type de service pour le TCP/IP -- Protocol : 0 pas utile .
/* Si la socket est valide */
if (sock!=INVALID_SOCKET)
{
cout << " La socket " << sock << " est maintenant ouverte en mode TCP/IP " << endl;
/* Configuration */
sin.sin_addr.s_addr=htonl(INADDR_ANY);
/* s_addr fait partie de la struc in_addr -- htonl permet de renvoyer le param --INNADDR_ANY signifie que le socket peut être associé à n'importe quel adresse de la machine . Donc adresse ip automatique . */
sin.sin_family=AF_INET; /* Protocole familial (IP) */
sin.sin_port=htons(PORT);
sock_err= bind(sock, (SOCKADDR*) &sin ,recsize); // Lier le socket à un point de communication défini par une adresse et un port , établir la connexion avec le client .
if(sock_err !=SOCKET_ERROR)
{
/* Démarrage du listage ( mode serveur ) */
sock_err=listen(sock,5); // Fonction listen mettant la socket en état d'écoute -- 5 = Nombre max de connexions pouvant être mis en attente .
cout << " Listage du port " << PORT << endl;
/* Si la socket fonctionne */
if (sock_err != SOCKET_ERROR)
{
/* Attente pendant laquelle le client se connecte */
cout << "Patientez pendant que le client se connecte sur le port " << PORT << endl;
csock= accept(sock,(SOCKADDR*) &csin, &crecsize); // csock : socket client et csin : son contexte d'adressage .
// Fonction accept permet la connexion entre le client et le serveur en acceptant un appel de connexion -- sock : Socket serveur -- (SOCKADDR*) &csin : pointeur sur le contexte d'adressage -- &taille : il faut créer une variable , pas comme avec bind .
cout << " Un client se connecte avec la socket " << csock << " de " << inet_ntoa(csin.sin_addr) << ":" << htons(csin.sin_port) << endl;
}
else
cerr << "listen";
}
else
cerr << "bind";
/* Fermeture de la socket client et de la socket serveur */
cout << " Fermeture de la socket client " << endl;
closesocket(csock);
cout << " Fermeture de la socket serveur " << endl;
closesocket(sock);
cout << " Fermeture du serveur terminée " << endl;
}
else
cerr << "socket";
}
return EXIT_SUCCESS;
} |
Je précise que ce sont casiment les même programme que le cours .