C++ błąd podczas kompilacji Gniazda TCP/IP

0

Próbuję napisać sobie przykład gniazda w boost.asio i na dzień dobry wita mnie błąd kompilacji

undefined reference to `__imp_WSAStartup`

w necie pisze, że jest to coś związanego z wsock32.lib lub flagą dla kompilatora -lwsock32

dodanie flagi nic nie daje, a bibliotekę nie wiem skąd wziąć. Czy ktoś coś poradzi ?

Mam codeblocka, boost, windows10 x64

1

Wpisz codeblocks winsock 32 w google.

3

weź sobie pod tym swoim windowsem odpal WSL2. Szybciej i łatwiej to pod linuksem zainstalujesz po przez apt-get.

poza tym patrz ile o tym piszą na SO
https://stackoverflow.com/questions/18559028/undefined-reference-to-imp-wsacleanup

nie jeden temat.

1

Bibliotekę już masz - z windowsem. Masz ją tylko podlinkować.

0

Uczę się tworzenia gniazd i są funkcje które jako argument przyjmują adres IP np

#include <iostream>
#include <winsock2.h>

using namespace std;

int main(int argc, char **argv)
{
    cout << "adres " << inet_addr(argv[1]) << endl;

    return 0;
}

ta funkcja adres IP z postaci oktetowej tj.

172.29.190.88

przerabia na typ unsigned long

moje pytanie jest takie.

W jaki sposób napisać funkcję która postać unsigned long zamienia na adres IP kropkowany ?
Wiem tylko tyle, że do tego celu trzeba wykorzystać maskę bitową. Ale w jaki sposób to zrobić aby otrzymać IP kropkowany ?

  1. cały adres zamienić na liczby binarne ? (łącznie z kropkami ?)
  2. potem co zrobić z maską bitową ?
1

@zkubinski: masz 4 oktety

jeżeli chcesz "wyłuskać" pierwszy oktet to możesz zrobić np. tak, że stosujesz operator AND z maską 11111111 00000000 00000000 00000000 i później robisz przesunięcie bitowe w prawo, wtedy masz przeliczony pierwszy oktet, z resztą robisz tak samo

1

Istnieją dwie symetryczne funkcje:

in_addr_t inet_addr(const char *cp);
char *inet_ntoa(struct in_addr in);

Wywołaj tą drugą ;)

0

mam taki kod. Czy może ktoś objaśnić dlaczego są takie dziwne zapisy w strukturze i jak to rozumieć ?

#include <iostream>
#include <winsock2.h>

using namespace std;

struct sockaddr_in myIP;

int main(int argc, char **argv)
{   
    myIP = inet_addr(argv[1]); //tutaj nie wiem jak przypisać to co zwróci ta funkcja
    
    char *my_addr = inet_ntoa(myIP.sin_addr);

    return 0;
}

dlaczego struktura ma takie słówko kluczowe ? Bo nie rozumiem

struct sockaddr_in nazwa_zmiennej;
2

@zkubinski:

dlaczego struktura ma takie słówko kluczowe ? Bo nie rozumiem

Nie za bardzo rozumiem pytanie, a tak przy okazji to chyba ci chodzi o nazwy pól struktury a nie słowa kluczowe.

1

Zobacz sobie w nagłówku winsock2.h, jak dokładnie to wygląda, bo idea (tak mocno przedpotopowa, że strach się bać…) jest taka, że to jest typedef, na modłę mniej-więcej (raczej nie dokładnie tak, bo to z czego innego wziąłem):

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};
4

chopie przecież ci pokazywaliśmy qt5(tam swoją droga jest jakis socket server). Później chciałeś boost tam też są sockety. Nagle wyskakujesz z winsock2.
ale koniec złośliwości
https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-inet_addr

a tam w kodzie nawet
// Here we could implement code to retrieve each address and
// print out the hex bytes

0

ogólnie skąd te moje pytania się wzięły ?
Zacząłem czytać tą dokumentację

i gość podaje tam różne funkcje i żeby zrozumieć to co tam pisze zacząłem szukać i próbować pisać aby zrozumieć co ten gość do mnie mówi

0

...i tu doszliśmy do nauki C oraz programowania systemowego ;)

1

Tak jak pisałem w PM:

man inet_ntoa:

Funkcje windowsowe są analogiczne, więc po prostu wypisz wynik...

screenshot-20210701224132.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1