Ĺadny brzuch
Witam
czy ktos moglby mi pomoc gdyz musze napisac program(aplikacje) w C++ typu klient-serwer i komunikacja musi odbywac sie za pomoca gniazd.
Sam program akurat nie stanowi wiekszego problemu gdyz juz jakies informacje na te temat posiadam mam problem z poprawnym kompilowaniem programow.
Program napisany jest poprawnie a jednak pojawiaja sie jakies bledy linkera.
Wiem ze trzeba cos jeszcze dodac do opcji kompilatora ale nie bardzo wlasnie wiem co.
Oczywiscie program pisze pod Windowsem.
Uzywam dev-c++ 4.9.9.2.
kod programu: #include <stdio.h> #include <errno.h> #include <winsock.h> extern int errno; int main (int argc, char **argv) { WSADATA wsaData; WSAStartup(MAKEWORD(1,1),&wsaData); // inicjacja biblioteki ws2_32.dll int fd; struct hostent *hent; struct sockaddr_in addr; struct in_addr in_address; int port; int result; char *tekst; /* tekst + \n */ if (argc < 4) { fprintf (stderr, "składnia: %s host port tekst\n", argv[0]); return -1; } port = atoi(argv[2]); if (!port) { fprintf (stderr, "%s nie jest numerem\n", argv[2]); return -1; } printf ("*** Próba połączenia z %s na porcie %d.\n", argv[1], port); printf ("*** Translacja adresu %s...\n", argv[1]); hent = gethostbyname(argv[1]); if (!hent) { fprintf (stderr, "%s: Nie znalazłem.\n", argv[1]); return -1; } printf ("*** Tworzenie socketa...\n"); fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (fd < 0) { perror ("socket"); return -1; } printf ("*** Wypełnianie struktury addr...\n"); memcpy ((char *) &in_address, hent->h_addr, sizeof(in_address)); addr.sin_addr.s_addr = in_address.s_addr; addr.sin_port = htons(port); addr.sin_family = AF_INET; printf ("*** Łączenie...\n"); result = connect(fd, (struct sockaddr *) &addr, sizeof(addr)); if (result < 0) { perror ("connect"); return -1; } printf ("*** Wysyłanie komunikatu...\n"); tekst = (char *) strdup(argv[3]); if (!tekst) { fprintf (stderr, "Panika. To nie mogło wystąpić.\n"); close (fd); return -1; } tekst[strlen(argv[3])] = '\n'; /* 0 -> \n */ write (fd, tekst, strlen(argv[3]) + 1); printf ("*** Zamykanie połączenia...\n"); close (fd); printf ("*** Tekst wysłany.\n"); WSACleanup(); // zamkniecie biblioteki return 0; }
logi kompilatora:
gcc.exe -c main.c -o main.o -I"C:/Dev-Cpp/include"
gcc.exe main.o -o "tska2.exe" -L"C:/Dev-Cpp/lib" -L"C:/WINDOWS/system32" -L"C:/WINDOWS/system"
main.o(.text+0x45):main.c: undefined reference to `WSAStartup@8'
main.o(.text+0x11a):main.c: undefined reference to `gethostbyname@4'
main.o(.text+0x187):main.c: undefined reference to `socket@12'
main.o(.text+0x202):main.c: undefined reference to `htons@4'
main.o(.text+0x241):main.c: undefined reference to `connect@12'
main.o(.text+0x33f):main.c: undefined reference to `WSACleanup@0'
collect2: ld returned 1 exit status
make.exe: *** [tska2.exe] Error 1
Bardzo prosze o pomoc i odpowiedz
Użytkownik migajek edytował ten post 25 luty 2006, 13:45
W dev-cpp: menu Project -> Project Options -> zakładka Parameters -> Add Library or Object i szukasz "libws2_32.a" w katalogu "lib" dev-cpp :)
dziekuje zadzialalo :)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
czy ktos moglby mi pomoc gdyz musze napisac program(aplikacje) w C++ typu klient-serwer i komunikacja musi odbywac sie za pomoca gniazd.
Sam program akurat nie stanowi wiekszego problemu gdyz juz jakies informacje na te temat posiadam mam problem z poprawnym kompilowaniem programow.
Program napisany jest poprawnie a jednak pojawiaja sie jakies bledy linkera.
Wiem ze trzeba cos jeszcze dodac do opcji kompilatora ale nie bardzo wlasnie wiem co.
Oczywiscie program pisze pod Windowsem.
Uzywam dev-c++ 4.9.9.2.
kod programu: #include <stdio.h> #include <errno.h> #include <winsock.h> extern int errno; int main (int argc, char **argv) { WSADATA wsaData; WSAStartup(MAKEWORD(1,1),&wsaData); // inicjacja biblioteki ws2_32.dll int fd; struct hostent *hent; struct sockaddr_in addr; struct in_addr in_address; int port; int result; char *tekst; /* tekst + \n */ if (argc < 4) { fprintf (stderr, "składnia: %s host port tekst\n", argv[0]); return -1; } port = atoi(argv[2]); if (!port) { fprintf (stderr, "%s nie jest numerem\n", argv[2]); return -1; } printf ("*** Próba połączenia z %s na porcie %d.\n", argv[1], port); printf ("*** Translacja adresu %s...\n", argv[1]); hent = gethostbyname(argv[1]); if (!hent) { fprintf (stderr, "%s: Nie znalazłem.\n", argv[1]); return -1; } printf ("*** Tworzenie socketa...\n"); fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (fd < 0) { perror ("socket"); return -1; } printf ("*** Wypełnianie struktury addr...\n"); memcpy ((char *) &in_address, hent->h_addr, sizeof(in_address)); addr.sin_addr.s_addr = in_address.s_addr; addr.sin_port = htons(port); addr.sin_family = AF_INET; printf ("*** Łączenie...\n"); result = connect(fd, (struct sockaddr *) &addr, sizeof(addr)); if (result < 0) { perror ("connect"); return -1; } printf ("*** Wysyłanie komunikatu...\n"); tekst = (char *) strdup(argv[3]); if (!tekst) { fprintf (stderr, "Panika. To nie mogło wystąpić.\n"); close (fd); return -1; } tekst[strlen(argv[3])] = '\n'; /* 0 -> \n */ write (fd, tekst, strlen(argv[3]) + 1); printf ("*** Zamykanie połączenia...\n"); close (fd); printf ("*** Tekst wysłany.\n"); WSACleanup(); // zamkniecie biblioteki return 0; }
logi kompilatora:
gcc.exe -c main.c -o main.o -I"C:/Dev-Cpp/include"
gcc.exe main.o -o "tska2.exe" -L"C:/Dev-Cpp/lib" -L"C:/WINDOWS/system32" -L"C:/WINDOWS/system"
main.o(.text+0x45):main.c: undefined reference to `WSAStartup@8'
main.o(.text+0x11a):main.c: undefined reference to `gethostbyname@4'
main.o(.text+0x187):main.c: undefined reference to `socket@12'
main.o(.text+0x202):main.c: undefined reference to `htons@4'
main.o(.text+0x241):main.c: undefined reference to `connect@12'
main.o(.text+0x33f):main.c: undefined reference to `WSACleanup@0'
collect2: ld returned 1 exit status
make.exe: *** [tska2.exe] Error 1
Bardzo prosze o pomoc i odpowiedz
Użytkownik migajek edytował ten post 25 luty 2006, 13:45
W dev-cpp: menu Project -> Project Options -> zakładka Parameters -> Add Library or Object i szukasz "libws2_32.a" w katalogu "lib" dev-cpp :)
dziekuje zadzialalo :)