Prosty klient tcp

0

Witam.
Uczę się programowania sieciowego. Napisałem prostego klienta (serwer jeszcze nie powstał). Mam problem bo nie mogę tego skompilować. Jeśli ktoś mógłby mi podpowiedzieć gdzie jest błąd to będę bardzo wdzięczny.

#include <winsock2.h>
#include <stdio.h>
#include <string.h>

#define PROTOPORT 5193 //domyslny numer portu

extern int errno;
char localhost[] = "localhost";

int main(int argc, char **argv)
{
struct hostent *ptrh; //tabela maszyn
struct protoent *ptrp; //tabel protokolow
struct sockaddr_in sad; //adres serwera
int sd; //destryktor gniazda
int port; //numer portu
char *host; //nazwa maszyny
int n; //liczba odebraych znakw
char buf[1000]; //bufor danych

#ifdef WIN32
WSADATA wsaData;
WSASStartup(0x0101, &wsaData);
#endif
memset((char*)&sad, 0, sizeof(sad)); //zerowanie stuuktury sad
sad.sin_family = AF_INET; //ustawianie rodziny

 //sprawdanie czy podano port
 
 if (argc > 2)
 {
     port = atoi(argv[2]);
 }
 else
 {
     port = PROTOPORT;
 }
 
 if (argc > 0)
 {
     sad.sin_port = htons((u_short)port);
 }
 else
 {
     fprintf(stderr, "błędny numer portu %s\n", argv[2]);
     exit(1);
 }
 
 //sprawdzanie czy podano nazwe maszyny
 
 if (argc > 1)
 {
     host = argv[1];
 }
 else
 {
     host = localhost;
 }
 
 //tlumaczenie nazwy maszyny na IP
 
 ptrh = gethostbyname(host);
 if (((char *)ptrh) == NULL) 
 {
     fprintf(stderr, "bledna nazwa maszyny: %s\n", host);
     exit(1);
 }
 memcopy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length);
 
 //zmien nazwe protokolu na numer
     
 if ( ((int)(ptrp = getprotobyname("tcp"))) ==0)
 {
      fprintf(stderr, "nie moge zmienic tcp na numer");
      exit(1);
 }
 
 // stworz gniazdo
 
 sd = socket(PF_INET, SOCK_STREAM, ptrp->p_proto);
 if (sd < 0)
 {
       fpdintf(stderr, " nie moge zrobic gniazda");
       exit(1);
 }
  
 //polacz gniazdo z serewerem
 
 if (connect(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0)
 {
       fprintf(stderr, "nie wywolano connect");
       exit(1);
 }
 
 //czytaj dane z gniazda i wypisuj na ekran
 
 n = recv(sd, buf, sizeof(buf), 0);
 while (n > 0)
 {
      write(1, buf, n);
      n = recv(sd, buf, sizeof(buf), 0);
 
 
 //zamknij gniazdo
 
 closesocket(sd);
 system("pause");
 return 0;

}

0

Jakbys napisal jakie bledy to bys znacznie zwiekszyl swoja szanse na uzyskanie prawidlowej odpowiedzi.
Mi, np nie chce sie przegladac calego kodu, bo mam co robic.

Strzelam, ze zapomniales w opcjach linkera dodac biblioteki wsock32, czy tej drugiej nie pamietam nazwy ;p

Lap przyklad kompilacji za pomoca gcc:
gcc wsock.c -o wsock -lwsock32

0

Błędy jakie mi pokazuje to:

In function main`:
syntax error at end of input :/

0

zapomniałeś jednego nawiasu klamrowego na końcu programu(jeśli to cały kod)

0

niedomkniety while na koncu

0

OK dzieki za pomoc ale jest teraz inny problem:) Wyrzuca mi błędy typu:
undefined reference sock:
i tak ze wszystkimi funkcjami sieciowymi. Jaka jeszcze mam dołączyc biblioteke ?? Czy to wina linkera?

0

Dołącz Ws2_32.a.

0

to teraz mam
Build error :/

Czy mogłby ktos wrzucic jakis najprostszy program z zastosowanie mnp socket?? Np zeby tworzyl gnizdo i tyle, zebym mogl sobie obczaic bede bardzo wdzieczny.

0

Build error i to wszystko?

Co do kodu, to ten, który podałeś na początku wydaję się ok (w każdym razie nie widzę jakichś błędów).

0

dokladnie to :
[Build error] [klient.exe] Error1

0

Jeśli używasz Deva, zmień IDE na coś lepszego, np. CodeBlocks.

0

Teraz spróbowałem sił w CodeBlock :)

Dołączyłem:
wsock32.lib
winsock32.lib
Ws32_2.lib

Oto co otrzymałem:

Linking console executable: klient.exe
mingw32-g++.exe: winsock32.lib: No such file or directory
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings

Mam windowsa 7 może to przez to ??

P.S. Widzę, że trzeba wracać do Linux-a. :)

0

Mam windowsa 7 może to przez to ??

A może przez to, że nie czytasz uważnie? Skąd to rozszerzenie LIB?!

0

Ups moja wina, ale teraz :

Compiling: main.c
Linking console executable: klient.exe
mingw32-g++.exe: winsock32.lib: No such file or directory
mingw32-g++.exe: Ws2_32.a: No such file or directory
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings

0

mingw32-g++.exe: winsock32.lib

:-D

Jeszcze raz przeczytaj poprzedni mój post.

mingw32-g++.exe: Ws2_32.a

Przed nazwą biblioteki dodaj lib-, np. libWs2_32.a.

0

wiem, że to wydaje sie smieszne ale w jednym tutorialu czytam ze mam dodać winsock32.lib, Ty mi piszesz o Ws32_2.a i cały czas mowimy i windows. Terraz wiem ze ma nie być lib, ale nie wiem czy ma byc .a czy .h czy jeszcze cos innego. Ja dopiero z tym zaczynam i czytam rozne tutorriale i widze ze kazdy ma swoja teorie i kazdemu działa tylko nie mi :-D Napisz w koncu jakie ma byc to rozszerzenie.

Teraz to inna rozmowa biore sie do roboty oby działało :-P

0

Jeśli masz jeszcze do mnie cierpliwość to poweidz co jeszcze moze byc nie tak [browar]

-------------- Build: default in klient ---------------

Linking console executable: klient.exe
mingw32-g++.exe: libWs2_32.a: No such file or directory
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings

Jak widać dalej chodzi o ten nieszczęsny Ws2_32.a

0

wiem, że to wydaje sie smieszne ale w jednym tutorialu czytam ze mam dodać winsock32.lib, Ty mi piszesz o Ws32_2.a i cały czas mowimy i windows.

.lib to rozszerzenie bibliotek dla VC i BCB, .a to biblioteka dla GCC. W tym przypadku system nie ma znaczenia, to uzależnione jest od linkera.

Jeśli masz jeszcze do mnie cierpliwość to poweidz co jeszcze moze byc nie tak

A jak dodałeś tę bibliotekę? Jeśli przez include, to źle. W CB dołączasz opcją: Project -> Build options -> Linker settings -> Add

0
0x666 napisał(a)

W CB dołączasz opcją: Project -> Build options -> Linker settings -> Add

Tak właśnie zrobiłem i po kliknięciu Add wyskakuje okienko i tam wpisuje libWs2_32.a

0

No to powiedz mi, dlaczego jest tam błąd kompilatora? Jakbyś źle wpisał nazwę biblioteki, albo po prostu jej nie miał, linker by krzyczał.

0
0x666 napisał(a)

No to powiedz mi, dlaczego jest tam błąd kompilatora? Jakbyś źle wpisał nazwę biblioteki, albo po prostu jej nie miał, linker by krzyczał.

Jakbym wiedział to bym sie nie pytał ;-P Nigdy z takimi rzeczami nie mialem do czynienia, zawsze do tego co pisalem wystarczaly standardowe biblioteki.

0

Jeśli zrobiłeś tak, jak napisałeś, nie powinno być problemu.

CB instalowałeś razem z MinGW?

0

Jak instalowałem CB to wyprałem full option

0

Heh, zajrzałem na stronę CB i tam jest napisane, że:

NOTE: The compiler included in codeblocks-8.02mingw-setup.exe does not work reliable on Windows Vista. Please do not use it and install a more recent one from MinGW. That is because at the time Code::Blocks was released there was no working GCC for Windows Vista available. Meanwhile there is.

0

lol nie ma to jak linux:) ale dalczego to nie działa w dev-cpp

0

Nie ma to jak visual (jeśli chodzi o windowsa) :-) Co jak co, ale GCC i ten cały szajs ma więcej wspólnego z linuksem niż w windowsem.

ale dalczego to nie działa w dev-cpp

Z tego samego powodu - MinGW.

0

0x666 dzięki za pomoc i cierpliwość [browar]

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