0
#include <sys/types.h>

#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>

#define WEB_PORT 80
#define BROWSER_PORT 8085

bool is_message(char mess[4096])
{
    if (mess[55] == 'G')
        return true;
    
    return false;
}

int main()
{
    // initilize
    WSADATA wsData;
    WORD ver = MAKEWORD(2, 2);
    
    int startup = WSAStartup(ver, &wsData);
    if (startup != 0)
    {
        printf("can't initialize!");
        return 1;
    }
    
    // create socket object
    SOCKET server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (server_socket == INVALID_SOCKET)
    {
        printf("can't make server socket!");
        return 1;
    }
    
    // define the address
    sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(BROWSER_PORT);
    server_address.sin_addr.s_addr = INADDR_ANY;
    
    // bind the socket to the correct address
    bind(server_socket, (sockaddr*) &server_address, sizeof(server_address));
    
    // listen to connect request
    std::cout << "Listening to connection request" << std::endl;
    listen(server_socket, SOMAXCONN);
    
    sockaddr_in web_client;
    int websize = sizeof(web_client);
    char browser_message[4096];
    while (1)
    {
        SOCKET web_socket = accept(server_socket,
                                   (sockaddr*) &web_client,
                                   &websize); // accept connection request
        if (web_socket == INVALID_SOCKET)
        {
            printf("can't make web socket!");
            return 1;
        }
        // receive message
        recv(server_socket, browser_message, sizeof(browser_message), 0);
        
        // show message
        std::cout << "Message: " << std::endl;
        for (size_t i = 0; i < sizeof(browser_message); i++)
            std::cout << browser_message[i];
        std::cout << std::endl;
        
        // filter to see if the message is the GET request
        if (is_message(browser_message))
        {
            continue;
        }
        
        std::cout << "Trash" << std::endl;
    }
    
    std::cout << "Message received!" << std::endl;
    
    /* ---------------- Client part ------------------------------------*/

    // // client part, sends GET message to the internet server
    // char response[4096];
    // int client_socket;
    // client_socket = socket(AF_INET, SOCK_STREAM, 0);
    // // // define the address
    // char *address;
    // struct sockaddr_in client_address;
    // client_address.sin_family = AF_INET;
    // client_address.sin_port = htons(WEB_PORT);
    // inet_aton(address, &client_address.sin_addr.s_addr);
    // // connect to the internet server
    // connect(client_socket, (struct sockaddr *)&client_address, sizeof(client_address));
    // send(client_socket, browser_message, sizeof(browser_message), 0);
    // recv(client_socket, &response, sizeof(response), 0);
    // close(client_socket);
    // // show response
    // std::cout << "Response: " << std::endl;
    // for (size_t i = 0; i < sizeof(response); i++)
    //     std::cout << response[i];
    // std::cout << std::endl;
    std::cout << "done" << std::endl;
    return 0;
}

I can't get this to compile with VScode. Can someone explain why? This is what i get in response.

Executing task: C/C++: g++.exe build active file <

Starting build...

C:\msys64\mingw64\bin\g++.exe -g "C:\Users\Martin F Lundgren\tdts06_lab\Lab2\proxy.cpp" -o "C:\Users\Martin F Lundgren\tdts06_lab\Lab2\proxy.exe"
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MARTIN~1\AppData\Local\Temp\ccxdMQUb.o:C:/Users/Martin F Lundgren/tdts06_lab/Lab2/proxy.cpp:29: undefined reference to `__imp_WSAStartup'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MARTIN~1\AppData\Local\Temp\ccxdMQUb.o: in function `main':
C:/Users/Martin F Lundgren/tdts06_lab/Lab2/proxy.cpp:37: undefined reference to `__imp_socket'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/Martin F Lundgren/tdts06_lab/Lab2/proxy.cpp:47: undefined reference to `__imp_htons'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/Martin F Lundgren/tdts06_lab/Lab2/proxy.cpp:51: undefined reference to `__imp_bind'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/Martin F Lundgren/tdts06_lab/Lab2/proxy.cpp:55: undefined reference to `__imp_listen'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/Martin F Lundgren/tdts06_lab/Lab2/proxy.cpp:63: undefined reference to `__imp_accept'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/Martin F Lundgren/tdts06_lab/Lab2/proxy.cpp:70: undefined reference to `__imp_recv'
collect2.exe: error: ld returned 1 exit status

Edit: when I try g++ -std=c++17 -Wall -Wextra -lws2_32 proxy.cpp C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64- mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe:
C:\Users\MARTIN~1\AppData\Local\Temp\ccl2nHQn.o:proxy.cpp:(.text+0x5c): undefined reference to __imp_WSAStartup' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MARTIN~1\AppData\Local\Temp\ccl2nHQn.o:proxy.cpp:(.text+0x9a): undefined reference to __imp_socket' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MARTIN~1\AppData\Local\Temp\ccl2nHQn.o:proxy.cpp:(.text+0xd8): undefined reference to __imp_htons' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MARTIN~1\AppData\Local\Temp\ccl2nHQn.o:proxy.cpp:(.text+0x109): undefined reference to __imp_bind' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MARTIN~1\AppData\Local\Temp\ccl2nHQn.o:proxy.cpp:(.text+0x143): undefined reference to __imp_listen' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MARTIN~1\AppData\Local\Temp\ccl2nHQn.o:proxy.cpp:(.text+0x171): undefined reference to __imp_accept' C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\MARTIN~1\AppData\Local\Temp\ccl2nHQn.o:proxy.cpp:(.text+0x1bb): undefined reference to `__imp_recv'

  • `#pragma comment(lib, ...)` is [not supported](https://stackoverflow.com/a/1685260/1424875) (for justified reasons) under gcc/g++; please use the compiler command line to link to libraries. – nanofarad Sep 13 '21 at 18:00
  • 1
    `#pragma comment(lib, "Ws2_32.lib")` is an instruction to the Microsoft toolchain to include the winsock2 library at link time. Since you are using another toolchain, you will need a different instruction. Passing `-lws2_32` on your linker command line should suffice. – Ben Voigt Sep 13 '21 at 18:00
  • 1
    This `#pragma comment(lib` stuff only works in MSVC, and you're using GCC. You need to add `-lws2_32` to the linker flags. – HolyBlackCat Sep 13 '21 at 18:00

0 Answers0