Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur fonction bind winsock2.h: 10014

Sujet résolu
Anonyme
11 mars 2022 à 18:29:03

Bonjour à tous !

Désolé de vous déranger mais... J'ai un petit soucis, en effet je suis en train de faire 2 petits sockets en langage C grâce à la lib windows.h et donc plus précisément winsock2.h.

Voilà le problème, lorsque j'exécute mon socket "server", j'ai un code d'erreur qui apparait concernant la fonction "bind", le code d'erreur est "10014", j'ai cherché de mon côté, je suis tombé sur la doc microsoft qui reporte tous les codes d'erreurs de WSAGetLastError(), j'ai trouvé mon code d'erreur mais je ne comprends pas....

Pouvez vous m'aider s'il vous plaît ? merci d'avance !

PS: voici le(s) code(s) source(s) et le lien de la doc de M$:

https://docs.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2

#include <stdio.h>
#include <winsock2.h>
#include <windows.h>

#include "headers.h"

int main(int argc, char **argv)
{
    WSADATA wsa;
    SOCKET s;
    SOCKET s2;
    struct sockaddr_in server;
    struct sockaddr_in client;

    printf("Initialising Winsock2...\n");
    if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d", WSAGetLastError());
        return 1;
    }
    printf("Initialised.\n");

    if((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d", WSAGetLastError());
        return 1;
    }
    printf("Socket created.\n");

    server.sin_addr.s_addr = inet_addr("192.168.0.13");
    server.sin_family = AF_INET;
    server.sin_port = htons(8888);

    // Binding
    if(bind(s, (struct sockaddr *)&server, sizeof(server) == SOCKET_ERROR))
    {
        printf("Bind failed with error code : %d", WSAGetLastError());
        return 1;
    }
    printf("Binded");

    printf("Listening incomming connections..");
    listen(s, 3);

    int c = sizeof(struct sockaddr_in);
    s2 = accept(s, (struct sockaddr *)&client, &c);
    if(s2 == INVALID_SOCKET)
    {
        printf("accept failed with error code : %d", WSAGetLastError());
    }else
    {
        printf("Connection accepted with %s %d", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
    }

    //Reply a test message to the client
    char *message = "You are connected to the Server, this message is from the Server";
    send(s2, message, strlen(message), 0);

    
    
    
    closesocket(s);
    WSACleanup();

    return 0;
}

Bonne soirée !

  • Partager sur Facebook
  • Partager sur Twitter
11 mars 2022 à 19:11:31

Ligne 35: une parenthèse fermante ) mal placée ...
  • Partager sur Facebook
  • Partager sur Twitter
11 mars 2022 à 19:16:25

----

-
Edité par edgarjacobs 11 mars 2022 à 19:16:40

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
11 mars 2022 à 20:17:44

magma a écrit:

Ligne 35: une parenthèse fermante ) mal placée ...


comment ça ? je vois pas où est le problème ligne 35... mes parenthèses sont  bien placé non ? (je vois juste peut-être pas... mais perso je vois pas de blem..)

Elle est rattachée à quoi cette parenthèse fermente ?

  • Partager sur Facebook
  • Partager sur Twitter
11 mars 2022 à 20:42:53

if(bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
12 mars 2022 à 7:45:47

Ok mais j'aurais eu un problème à la compilation non ?

Or, ce n'est pas le cas

  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2022 à 9:07:43

if(bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)

Ce code compare la valeur renvoyée par bind(s, (struct sockaddr*)&server, sizeof(server) à SOCKET_ERROR.

if(bind(s, (struct sockaddr *)&server, sizeof(server) == SOCKET_ERROR))

Mais ce code appelle la fonction bind(s, (struct sockaddr*)&server, sizeof(server) == SOCKET_ERROR) !

En gros, ça compare sizeof(server) à SOCKET_ERROR, donc ça fait un booléen qui vaut 0 ou 1 : 

if(bind(s, (struct sockaddr *)&server, 0 ou 1))

Et à la fin, tu appelles bind avec les arguments ci-dessus, et si la valeur retournée par bind est différente de 0, le corps du if est exécuté.

PS :

Tu n'as pas d'erreur de compilation parce qu'il y a des conversions implicites.

Ton code ne fait pas ce que tu souhaites, mais il reste valide pour ton compilateur donc lui il compile.

-
Edité par Chi_Iroh 12 mars 2022 à 9:09:05

  • Partager sur Facebook
  • Partager sur Twitter
12 mars 2022 à 10:20:23

    if(   bind(  s,   (struct sockaddr *)&server,   sizeof(server) == SOCKET_ERROR  )     )


Regarde bien le troisième paramètre de bind en rouge ! C'est le résultat d'un test d'égalité ! Tu est bien sur que c'est ce que tu voulais mettre ?

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
12 mars 2022 à 13:20:05

Merci.

J'ai réglé ce problème de parenthèses et tout fonctionne.

merci, passez une bonne journée

cordialement

  • Partager sur Facebook
  • Partager sur Twitter
14 mars 2022 à 9:06:29

Petite note, bind est irrégulier c'est plutôt “bound” que “binded” :)
  • Partager sur Facebook
  • Partager sur Twitter

l'azerty est aux dispositions ce que subversion est aux SCM