C/C++ Erreur Compilation de Winsock

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Récemment, j’ai changé d’IDE, de Visual Studio à gcc (command line). J’avais fais un petit programme winsock pour ’winsocker’.. :euh:

Le code marchait parfaitement sur visual studio, par contre, en le compilant avec gcc :

gcc .\nom_du_programme.cpp

sur windows power shell, j’obtient la belle erreur :

.\Winsock_Server.cpp: In function ’int main()’: .\Winsock_Server.cpp:84:58: error: ’inet_ntop’ was not declar inet_ntop(AF_INET, &client.sin_addr, host, NI_MAXHOST);

Si qulqu’un pouvait m’aider :D

C0de:

  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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <iostream>
#include <WS2tcpip.h>
#include <string>

#pragma comment (lib, "ws2_32.lib")


using std::cout;
using std::endl;
using std::string;


int main()
{

    //---Initialze Winsock---
    WSADATA wsdata;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsdata);  //MAKEWORD(2, 2) |> request version 2.2 of winsock
    if (iResult != 0){
        cout <<
            "Error at: Initializing Winsock.., Winsock 2.2 may be not supported by your system or simply not installed"
            << endl;
    return 1;
    }
    else
    {
        cout <<
            "Winsock is working,\n"
            "Status : "
            << wsdata.szSystemStatus << endl;
    }


    //---Create a socket---
    SOCKET listeningSock = socket(AF_INET, SOCK_STREAM, 0);
    if (listeningSock == -1)
    {
        cout <<
            "Error at: Socket Error.. "
            << endl;
        closesocket(listeningSock);
        WSACleanup();
        return 1;
    }



    //---Bind ip addr and port to a socket---
    sockaddr_in hint;
    hint.sin_family = AF_INET;//IPv4
    hint.sin_port = htons(54000);//Port
    hint.sin_addr.S_un.S_addr = INADDR_ANY;//All ip's can connect

    bind(listeningSock, (sockaddr*)&hint, sizeof(hint));


    //---Tell Winsock socket is for listening---
    listen(listeningSock, SOMAXCONN);


    //---Wait for connection---
    sockaddr_in client;
    int clientsize = sizeof(client);

    SOCKET ClientSocket = accept(listeningSock, (sockaddr*)&client, &clientsize) ;
    if (ClientSocket == INVALID_SOCKET)
    {
        cout <<
            "Error at: Connection.. "
            << wsdata.szSystemStatus << endl;
    }

    char host[NI_MAXHOST];
    char service[NI_MAXHOST];

    ZeroMemory(host, NI_MAXHOST);
    ZeroMemory(service, NI_MAXHOST);

    if (getnameinfo((sockaddr*)&client, sizeof(client), host,NI_MAXHOST, service, NI_MAXSERV, 0) == 0)
    {
        cout << host << " is connected on port " << service << endl;
    }
    else {
    inet_ntop(AF_INET, &client.sin_addr, host, NI_MAXHOST);//<-----------------ICICICI!!!
        cout << host << " is connected on port " << ntohs(client.sin_port) << endl;
    }

    //---Close listening socket---

    closesocket(listeningSock);

    //---While loop: accept and echo message back to client (test)---
    char buffer[4096];

    while (true)
    {
        ZeroMemory(buffer, 4096);

        //Wait client send data
        int bytesReceived = recv(ClientSocket, buffer, 4096, 0);
        if (bytesReceived == SOCKET_ERROR)
        {
            cout <<
                host <<
                " is now Disconnected.. "
                << endl;
            break;
        }
        if (bytesReceived ==0)
        {
            cout << "Error at: recevieiving information.." << endl;
        }

        cout << (buffer, 0, bytesReceived) << endl;
        //Echo message back |> client
        send(ClientSocket, buffer, bytesReceived + 1, 0);
        //Echo client message |> serv console
        cout << "["<< host << "]"<< "[+]" << buffer << endl;

    }
    //---Close socket---
    closesocket(ClientSocket);

    //---Clean up Winsock---
    WSACleanup();


    system("pause");



    return 0;//Cyka Blyt
}

`

Édité par PixarFilmz-

+0 -0

Je ne suis pas sur Windows, mais la MSDN me donne ça comme commentaire :

Possible values for the address family are defined in the Ws2def.h header file. Note that the Ws2def.h header file is automatically included in Winsock2.h, and should never be used directly. Note that the values for the AF_ address family and PF_ protocol family constants are identical (for example, AF_INET and PF_INET), so either constant can be used.

MSDN

Bref, ça parle de header que tu n’inclues pas. Essaye d’inclure Winsock2.h par exemple.

ache.one                 🦹         👾                                🦊

+0 -0
Auteur du sujet

Je ne suis pas sur Windows, mais la MSDN me donne ça comme commentaire :

Possible values for the address family are defined in the Ws2def.h header file. Note that the Ws2def.h header file is automatically included in Winsock2.h, and should never be used directly. Note that the values for the AF_ address family and PF_ protocol family constants are identical (for example, AF_INET and PF_INET), so either constant can be used.

MSDN

Bref, ça parle de header que tu n’inclues pas. Essaye d’inclure Winsock2.h par exemple.

ache

En rajoutant Winsock2.h Erreur:

C:\Users\AdminHP\source\Projects_\Communication\Winsock_Server.cpp: In function 'int main()': C:\Users\AdminHP\source\Projects_\Communication\Winsock_Server.cpp:85:58: error: 'inet_ntop' was not declared in this scope inet_ntop(AF_INET, &client.sin_addr, host, NI_MAXHOST); ^

En rajoutant ceux dans la doc de MSDN <windows.h> <winsock2.> <ws2tcpip.> <stdlib.> <stdio.h>:

.\Winsock_Server.cpp: In function 'int main()': .\Winsock_Server.cpp:88:58: error: 'inet_ntop' was not declared in this scope inet_ntop(AF_INET, &client.sin_addr, host, NI_MAXHOST);

En gros, avec tous ces headers :

<iostream> <winsock2.h> <windows.h> <ws2tcpip.h> <stdlib.h> <stdio.h> <string> <Winsock2.h>

Ça fonctionne pas.

Édité par PixarFilmz-

+0 -0

Très certainement oui, mais là ce n’est pas le problème.

Ici, c’est un problème de définition. Si c’était que GCC n’arrivait pas à linker on aurait un problème au niveau du linker. Ça arrivera peut-être, mais plus tard.

Édité par ache

ache.one                 🦹         👾                                🦊

+0 -0

(Utiliser Winsock en C++, c’est un peu tordu, il faut tout wrapper pour être robuste aux exceptions, ce qui demande pas mal de boulot pas très intéressant, là où une lib C++ aurait déjà fait le boulot pour nous, boost ASIO par exemple).

First : Always RTFM - "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein [Tutoriel Frama-C WP]

+2 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte