Cannot solve this error in my TCP server code

367 Views Asked by At

So, I was trying to code this simple TCP server, but I'm stucked with this error

error: 'inet_ntop' was not declared in this scope; did you mean 'inet_ntoa'

I know that I have to use ntop and not ntoa. But I can't find out how to get rid of this error. I searched everywhere and couldn't find anything. I hope someone can help me. My code is below.

#define _WIN32_WINNT 0x501


#include <iostream>
#include <WS2tcpip.h>

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

using namespace std;

int main(void){

    //initialize winsock
    WSADATA WSData;
    WORD ver = MAKEWORD(2, 2);

    int WSOK = WSAStartup(ver, &WSData);
    if (WSOK != 0){
        cerr << "Can't initialize winsock! Quitting" << endl;
        return 0;
    }

    //create a socket
    SOCKET listening = socket(AF_INET, SOCK_STREAM, 0);
    if (listening == INVALID_SOCKET)
    {
        cerr << "Can't create a socket! Quitting" << endl;
        return 0;
    }
    
    // bind the socket to an ip adress an port to a socket
    sockaddr_in hint;
    hint.sin_family = AF_INET;
    hint.sin_port = htons(54000);
    hint.sin_addr.S_un.S_addr = INADDR_ANY; // could also use inet_pton...

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

    //tell winsock the socket is for listening
    listen(listening, SOMAXCONN);


    //wait for connection

    sockaddr_in client;
    int clientSize = sizeof(client);

    SOCKET clientSocket = accept(listening, (sockaddr*)&client, &clientSize);

    char host[NI_MAXHOST]; // client's remote name
    char service[NI_MAXSERV]; // Service (i.e port) the client is connected on

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

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

    //close listening socket
    closesocket(listening);

    //while loop: accept and echo message bac to client
    char buf[4096];

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

        //wait for client send data
        int bytesReceived = recv(clientSocket, buf, 4096, 0);
        if (bytesReceived == SOCKET_ERROR)
        {
            cerr << "Error in recv(). Quitting" << endl;
            break;
        }
        if (bytesReceived == 0)
        {
            cout << "Client disconnected " << endl;
            break;
        }

        //echo message back to client
        send(clientSocket, buf, bytesReceived + 1, 0);

    }
    
    //close socket
    closesocket(clientSocket);

    // cleanup winsock
    WSACleanup();

}
1

There are 1 best solutions below

1
On BEST ANSWER

inet_ntop() requires Windows Vista and later at runtime, but you are setting _WIN32_WINNT to 0x501, which represents Windows XP, so the declaration of inet_ntop() in <w32tcpip.h> gets disabled at compile-time to prevent the program from failing to start at runtime.

You need to set _WIN32_WINNT to at least 0x600 instead to enable inet_ntop().


However, even after you fix that issue, your code will still fail to compile, because you have a syntax mistake in your call to inet_ntop() - your parenthesis are unbalanced in the 2nd parameter. You have either a missing (, or an erroneous ), depending on which of the following syntaxes you were trying to use:

inet_ntop(AF_INET, &(client.sin_addr), host, NI_MAXHOST);

inet inet_ntop(AF_INET, &client.sin_addr, host, NI_MAXHOST);


You also have other logic errors that won’t show up until runtime. You are not doing any error handling on bind(), listen(), and send(). And you have a potential buffer overflow on send(), too.