je fais un pogramme en C qui a pour but de tester une connection entre deux ordinateurs : l'ordinateur A qui possede le programme serveur et l'ordinateur B qui a le programme client.
Voila le début de mon code : (je suis sur que tout le code est valide, pas besoin de le mettre en entier)
Client :
- Code: Tout sélectionner
#if defined (WIN32)
#include
#elif defined (linux)
#include
#include
#include
#include
#include
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#endif
#include
#include
#define PORT 1723
int main(void)
{
#if defined (WIN32)
WSADATA WSAData;
int erreur = WSAStartup(MAKEWORD(2,0), &WSAData);
#else
int erreur = 0;
#endif
SOCKET sock;
SOCKADDR_IN sin;
int sock_err;
char buffer[32] = "";
/* Si les sockets Windows fonctionnent */
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("[COLOR=Red]IP ORDINTEUR A ICI[/COLOR]");
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
/* Si l'on a réussi à se connecter */
if(connect(sock, (SOCKADDR *)&sin, sizeof(sin)) != SOCKET_ERROR)
{
Serveur :
- Code: Tout sélectionner
#if defined (WIN32)
#include
#elif defined (linux)
#include
#include
#include
#include
#include
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#endif
#include
#include
#define PORT 1723
int main(void)
{
#if defined (WIN32)
WSADATA WSAData;
int erreur = WSAStartup(MAKEWORD(2,0), &WSAData);
#else
int erreur = 0;
#endif
SOCKET sock;
SOCKADDR_IN sin;
SOCKET csock;
SOCKADDR_IN csin;
char buffer[32] = "Bonjour !";
int recsize = (int) sizeof csin;
int sock_err;
/* Si les sockets Windows fonctionnent */
if(!erreur)
{
sock = socket(AF_INET, SOCK_STREAM, 0);
/* Si la socket est valide */
if(sock != INVALID_SOCKET)
{
printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);
/* Configuration */
sin.sin_addr.s_addr = htonl(INADDR_ANY); /* Adresse IP automatique */
sin.sin_family = AF_INET; /* Protocole familial (IP) */
sin.sin_port = htons(PORT); /* Listage du port */
sock_err = bind(sock, (SOCKADDR *) &sin, sizeof sin);
/* Si la socket fonctionne */
if(sock_err != SOCKET_ERROR)
{
/* Démarrage du listage (mode server) */
sock_err = listen(sock, 5);
printf("Listage du port %d...\n", PORT);
/* Si la socket fonctionne */
if(sock_err != SOCKET_ERROR)
{
/* Attente pendant laquelle le client se connecte */
printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);
csock = accept(sock, (SOCKADDR *) &csin, &recsize);
printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));
Bon le code marche en local (les deux programmes executés sur l'ordinateur A).
maintenant si je veux lancer serveur sur l'ordi A et client sur le B, je change l'ip pour le prgm client et je met l'ip internet de l'ordinateur A. Théoriquement, la connection devrait se faire. Mais ce n'est pas le cas : le prgm client ne se connecte pas au serveur. Pourtant je port est bien commun aux deux : j'ai choisi un port > 1500 et < 2^16 (pour avoir plus de chance qu'il soit libre). Quelle erreur ai je faite ?
merci d'avance
Lapras
