Bonjour

Je fais face à un petit problème avec les sockets. Le but de mon code est de communiquer entre serveur et client. Tout est dans un seul programme.

Cas n°1 : on lance le programme pour la première fois, donc le programme passe en mode serveur et attend qu'un client se connecte.

Cas n°2 : le programme est déjà lancé et on le relance encore une fois, donc le programme passe en mode client pour communiquer avec le serveur déjà lancé.

Le problème survient quand j'appelle la fonction bind (qui se trouve dans la partie serveur du code). Quand je fais un perror("bind"), il me met "No error". Pourtant, ma condition renvoie FALSE. Je vous laisse mon code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define PORT 4000
 
int main(int argc, char *argv[])
{
    WSADATA WSAData;
    int erreur = WSAStartup(MAKEWORD(2, 0), &WSAData);
 
    // SERVEUR
    SOCKADDR_IN sin;
    SOCKET sock;
 
    // CLIENT
    SOCKADDR_IN csin;
    SOCKET csock;
 
    int sock_err;
 
    if(!erreur)
    {
        sock = socket(AF_INET, SOCK_STREAM, 0);
 
        sin.sin_addr.s_addr = inet_addr("127.0.0.1");
        sin.sin_family = AF_INET;
        sin.sin_port = htons(PORT);
 
        if(connect(sock, (SOCKADDR *) &sin, sizeof(sin)) != SOCKET_ERROR) // connexion réussie, on passe en mode client
        {
            printf("Connecte a %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
        }
 
        else // la connexion a échoué, on passe en mode serveur
        {
            unsigned int recsize = (unsigned int) sizeof sin;
            unsigned int crecsize = (unsigned int) sizeof csin;
 
            if(sock != INVALID_SOCKET)
            {
                sock_err = bind(sock, (SOCKADDR *) &sin, recsize);
 
                if(sock_err != SOCKET_ERROR)
                {
                    sock_err = listen(sock, 5);
 
                    if(sock_err != SOCKET_ERROR)
                    {
                        printf("En attente d'un client ...\n");
                        csock = accept(sock, (SOCKADDR *) &csin, (int*)&crecsize);
                        printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));
                    }
                    else
                        perror("listen");
                }
                else
                    perror("bind");
 
                closesocket(csock);
                closesocket(sock);
            }
            else
                perror("socket");
        }
 
        WSACleanup();
    }
 
    system("PAUSE>NUL");
 
    return EXIT_SUCCESS;
}
Merci d'avance