IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

ERREUR Bind() 10038


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2019
    Messages : 15
    Points : 8
    Points
    8
    Par défaut ERREUR Bind() 10038
    Bonjour a tous,

    J'ai beau vérifier de fond en comble mais je ne trouve pas du tout ce qui provoque cette erreur de bind ....
    Pour le contexte, je dois faire un réseau en multi thread en C++ sur Windows et la fonction si dessous me sert à créer une nouvelle socket d'écoute sur le réseau local.
    J'utilise les lib <windows.h>, <thread>, <winsock2.h>, <ws2tcpip.h>, <fstream>, <string> , <vector>, <limits>, <iostream>, <stdlib.h>, <stdio.h> (je ne sais pas si c'est utile mais ne on sait jamais).

    Voici 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
     
    SOCKET Init_Serveur() {
    	SOCKET ListenSocket = INVALID_SOCKET;
    	int iResult;
    	struct addrinfo hints, *result = NULL;
     
    	ZeroMemory(&hints, sizeof(hints));
    	hints.ai_family = AF_INET;  // Address Format Internet
    	hints.ai_socktype = SOCK_STREAM;  //  Provides sequenced, reliable, two-way, connection-based byte streams
    	hints.ai_protocol = IPPROTO_TCP;  // Indicates that we will use TCP
    	hints.ai_flags = AI_PASSIVE;  // Indicates that the socket will be passive => suitable for bind()
    	if (iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result) != GOOD_EXEC) {
    		std::cout << "Getaddrinfo failed with error: " << iResult << std::endl;
    	}
    	else {
    		if (ListenSocket = socket(result->ai_family, result->ai_socktype,
    			result->ai_protocol) == INVALID_SOCKET) {
    			std::cout << "Socket failed with error: " << WSAGetLastError() << std::endl;
    			ListenSocket = INVALID_SOCKET;
    		}
    		else {
    			if (iResult = bind(ListenSocket, result->ai_addr,
    				(int)result->ai_addrlen) == SOCKET_ERROR) {
    				std::cout << "Bind failed with error: " << WSAGetLastError() << std::endl;
    				closesocket(ListenSocket);
    				ListenSocket = INVALID_SOCKET;
    			}
    			else {
    				if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR) {
    					std::cout << "Listen failed with error: " << WSAGetLastError() << std::endl;
    					closesocket(ListenSocket);
    					ListenSocket = INVALID_SOCKET;
    				}
    			}
    		}
    	}		
    	freeaddrinfo(result);
     
    	return ListenSocket;
    }
    Merci d'avance de votre aide.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    10038 signifie que le paramètre n'est pas un socket valide.
    Le code est peu lisible. Toute la magouille avec getaddrinfo est superflue.
    Tes if sont étranges, même si j'apprécie cette syntaxe pour des pointeurs, faire une assignation puis un check de cette façon réduit la lisibilité, et avoir les if sur 1 ou 2 lignes n'aide pas.
    Tous ces if en cascades n'ont également pour seul résultat que de diminuer la lisibilité.

    Ouvrir un socket serveur TCP se fait en quelques lignes très simples
    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
    SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if (server == INVALID_SOCKET)
    	{
    		std::cout << "Erreur initialisation socket : " << WSAGetLastError();
    		return -2;
    	}
     
    	const unsigned short port = 9999;
    	sockaddr_in addr;
    	addr.sin_addr.s_addr = INADDR_ANY;
    	addr.sin_port = htons(port);
    	addr.sin_family = AF_INET;
     
    	int res = bind(server, (sockaddr*)&addr, sizeof(addr));
    	if (res != 0)
    	{
    		std::cout << "Erreur bind : " << WSAGetLastError();
    		return -3;
    	}
     
    	res = listen(server, SOMAXCONN);
    	if (res != 0)
    	{
    		std::cout << "Erreur listen : " << WSAGetLastError();
    		return -4;
    	}
    Sans oublier d'initialiser WinSock au préalable bien sûr.

    Pour le reste : https://bousk.developpez.com/cours/r...iers-pas/#LIII

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur Bind: Address family not supported by protocol
    Par sambia39 dans le forum Réseau
    Réponses: 4
    Dernier message: 30/06/2014, 22h50
  2. Erreur Binding Listbox.style
    Par mariox dans le forum C#
    Réponses: 3
    Dernier message: 22/08/2012, 15h38
  3. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/03/2004, 18h02
  4. erreur 10038
    Par made_in_france dans le forum MFC
    Réponses: 2
    Dernier message: 08/01/2004, 17h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo