[C++] Problem z funkcją 'bind'

Zrobilem na szybkiego kod do klienta zgodnie z powyzszym kodem :wink: polaczylem oba .cpp w jeden projekt, skompilowalem, uruchomil sie, wyswietlil “Podaj adres IP serwera” i co tutaj mam wpisac? cokolwiek nie wpisze to zwraca mi -1 czyli blad i wyswietla “Blad polaczenia…” :slight_smile: o co chodzi? zapewne cos z adresami jak zwykle :confused:

#include 

#include 

#include 

#include 

#include 


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


using namespace std;


int main()

{

	int m_port = 1024;

	int soc1,soc2;

	int odp;


	WSAData wsdat;

	if (WSAStartup(MAKEWORD(1,1),&wsdat)!= 0)

	{

	cout<
	exit(1);

	}


	cout<<"Podaj adres IP serwera: ";

	string adresik;

	cin>>adresik;


	soc1 = socket(PF_INET,SOCK_STREAM,0);


	struct sockaddr_in odb;

	odb.sin_family = PF_INET;

	odb.sin_port = htonl(m_port);

	odb.sin_addr.s_addr = inet_addr(adresik.c_str());

	memset(odb.sin_zero,0,sizeof(odb.sin_zero));


	odp = connect(soc1,(struct sockaddr*)&odb,sizeof (odb));

	cout<
	if (odp == -1)

	{

		cout<<"Blad polaczenia.."<
		exit(1);

	}

	else

		cout<<"Polaczono.Podaj wiadomosc do wyslania.. "<

	char wiadomosc [512];

	for (;;)

	{

		memset(wiadomosc,0,sizeof (wiadomosc));

		recv(soc1,wiadomosc,511,NULL);

		cout<
	}


	getch();

}

A wpisujesz w postaci IP czy jako nazwa domenowa ?

Przecież widać co masvidal zrobił nie tak, połączył klienta z serwerem czyli próbuje zrobić “hermafrodytę”. Nie ma takiej możliwości.

Z tego co widze to tam jest klient ale bez mozliwosci wysyłania polecen :wink:

A to:

 cout<<"Polaczono.Podaj wiadomosc do wyslania.. "<<endl; [/code]

? :wink:

hehe no to pojechalem :wink: w zasadzie to myslalem ze tak to dziala. Pisze kod klienta, serwera w jednym projekcie, uruchamiam i tak jakby sam ze soba sie komunikuje :wink: jak to wykonac w inny sposob?

A co chcesz osiągnąć?

Napisac aplikacje klient-serwer i przeslac jakis komunikat. A czy za pomoca gniazd datagramowych mozna wyslac np. caly datagram IPv4?:wink:

Aplikacja klient-serwer składa się przeważnie z dwóch plików wykonywalnych umownie: server i client, najczęściej się zdarza że te dwie aplikacje nawet nie mogą działać na jednej platformie, ponieważ server jest napisany pod unix/linux zaś klient pod windows. Bardzo rzadko się zdarza że klient jest połączony z serwerem do jednego pliku wykonywalnego, w takich przypadkach przeważnie program jest uruchomiany jako serwer ze specjalną opcją, i zachowuje się w tym przypadku zupełnie inaczej. Nawet jeżeli serwer i klient są włączeni do tego samego pliku wykonywalnego i każde uruchomienie powoduje jednoczesny start klienta i serwera to i tak część klienta działa w innym wątku niż część serwera. W sumie jak nie kombinuj i tak masz te dwie części od siebie oddzielić. Nawet użycie datagramów tego nie zmieni.

Faktycznie :confused: teraz zrobilem dwie oddzielne aplikacje serwera i klienta, czy mozna je przetestowac na jednym komputerze? :slight_smile: znalazlem w jakims pdf’ie cos takiego “A Teraz możemy przystąpić do testowania aplikacji. Kompilujemy i uruchamiamy proces serwera. Uruchamiamy nasłuchiwanie (przycisk Uruchom). Uruchamiamy proces klienta (powinien być niezależną aplikacją, uruchamianą spoza środowiska zintegrowanego) i podajemy adres IP zgodny z adresem serwera. Jeśli pracujemy na jednym komputerze lokalnym to podajemy adres swojego komputera (wtedy też mamy sieć, chociaż złożoną z jednego hosta i możemy oba procesy uruchomić „obok siebie” na ekranie).” da rade? :slight_smile:

Oczywiście, możesz podać IP swego komputera lub podać tak zwany localhost - IP 127.0.0.1 - który w windows’ach oznacza mniej więcej - ten komputer.

No wiec uruchomilem aplikacje serwera, otrzymalem komunikat “Oczekiwanie na polaczenie…” :

#include 

#include 

#include 

#include 

#include 


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


using namespace std;



int main()

{

	int m_port = 8080;

	int odp,dl;

	int soc1,soc2;


	WSAData wsdat;

	if (WSAStartup(MAKEWORD(1,1),&wsdat)!= 0)

	{

	cout<
	exit(1);

	}


	soc1 = socket(PF_INET,SOCK_STREAM,0);

	if (soc1 == -1)

	{

		cout<<"Blad.."<
		exit(1);

	}

	else

		cout<<"Utworzono socket na porcie.. "<<"( "<

	struct sockaddr_in odb; 

	odb.sin_family = PF_INET;

	odb.sin_port = htonl(m_port);

	odb.sin_addr.s_addr = htonl(INADDR_ANY)

	memset(odb.sin_zero,0,sizeof(odb.sin_zero));


	odp = bind(soc1, (struct sockaddr*)&odb,sizeof (odb));

	if (odp == -1)

	{

		cout<<"Przypisanie adresu nie powiodlo sie.."<
		exit(1);

	}

	else

		cout<<"Przypisano adres.. "<

	odp = listen(soc1,10);

	if (odp == -1)

	{

		cout<<"Nasluch nie powiodl sie.."<
		exit(1);

	}


	//nawiazywanie polaczenia

	cout<<"Oczekiwanie na polaczenie..."<

	struct sockaddr_in nad;

	dl = sizeof(struct sockaddr_in);


	soc2 = accept(soc1,(struct sockaddr *)&nad,&dl);

	if (soc2 == INVALID_SOCKET) cout << "Blad polaczenia..";


	send (soc2,"Welcome",8,0);

	char wiadomosc [512];

	for (;;)

	{

		recv(soc2,wiadomosc,512,0);

		send(soc2,wiadomosc,511,0);

	}


	closesocket(soc2);

	closesocket(soc1);


	WSACleanup();


	getch();


}

nastepnie uruchomilem aplikacje klienta, wpisywalem adres 127.0.0.1, swoj adres i nic, connect zwraca -1 “Blad polaczenia…” i zamyka aplikacje :confused: tutaj kod klienta:

#include 

#include 

#include 

#include 

#include 


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


using namespace std;


int main()

{

	int m_port = 8080;

	int soc1,soc2;

	int odp;


	WSAData wsdat;

	if (WSAStartup(MAKEWORD(1,1),&wsdat)!= 0)

	{

	cout<
	exit(1);

	}


	hostent *host=0;

	cout<<"Podaj adres IP serwera: ";

	string adresik;

	cin>>adresik;


	soc1 = socket(PF_INET,SOCK_STREAM,0);


	struct sockaddr_in odb;

	memset(odb.sin_zero,0,sizeof(odb.sin_zero));

	odb.sin_family = PF_INET;

	odb.sin_port = htonl(m_port);

	odb.sin_addr.s_addr = inet_addr(adresik.c_str());


	if (odb.sin_addr.s_addr == INADDR_NONE)

   {

      host = gethostbyname (adresik.c_str());

      if (host == NULL) cout << "Nie moge skonwertowac adresu!\n";

      CopyMemory(&odb.sin_addr, host->h_addr_list[0], host->h_length);


   }


	odp = connect(soc1,(struct sockaddr*)&odb,sizeof (odb));

	cout<
	if (odp == -1)

	{

		cout<<"Blad polaczenia.."<
		exit(1);

	}

	else

		cout<<"Polaczono.Podaj wiadomosc do wyslania.. "<

	char wiadomosc [512];

	for (;;)

	{

		memset(wiadomosc,0,sizeof (wiadomosc));

		recv(soc1,wiadomosc,511,NULL);

		cout<
	}


	getch();

}

macie moze jakis pomysl? :wink:

Spróbuj tak:

SOCKET soc1,soc2; [/code]

zamiast

[code=php]int soc1,soc2; 

i zamiast

socket(PF_INET,SOCK_STREAM,0); [/code]

wstaw

[code=php]socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); 

niestety nadal to samo :wink: wydaje mi sie ze moze byc problem z adresami,konwersja, ale nie mam pomyslu jak to rozwiazac :confused:

Sprawdź czy nie stoi firewall na ten port.

ogolnie rzecz mowiac posiadam stale ip (net osiedlowy) i raczej jestem za NAT-em :wink: wpisalem kilka losowych numerow portow na stronce do sprawdzania i wiekszosci przypadkow byl error, co by moglo oznaczac ze wiekszosc portow mam poblokowane :wink: jak w takim przypadku przetestowac ta aplikacje?

Wejdź na ustawienie, zapora i dodaj swoja aplikacje do wyjątków.

Dodalem obie aplikacje do wyjatkow ale nadal nie dziala. Wpisuje wewnetrzne ip, zewnetrzne, petle, 0.0.0.0 i nic. Jesli to nie porty to nie wiem, wydaje sie ze moze wprowadzanie adresu.

edit: sciagnalem jakies przykladowe kody serwera i klienta, uruchomilem, wpisuje adres, komunikuje sie, da sie wyslac komunikat bez problemu. Tak ze nie wiem co w moich kodach nie dziala :wink: chyba zaczne pisac jeszcze raz od podstaw, bo to pewnie jakis czeski blad :wink: dzieki wielkie za pomoc i zaangazowanie :slight_smile: