problem z socketami

0

Witam, z racji swojego zapału do programowania postanowiłem napisać aplikację klient - serwer i komunikację miedzy nimi przez sieć i napotkałem pewien problem. Może zacznę od tego, że wzorowałem się na tych tutorialach:
http://msdn.microsoft.com/en-us/library/ms738545%28v=vs.85%29.aspx głownie na tym i różne podstrony;
warsztat.gd/articles.php?x=view&id=274 , http://firsthost.nazwa.pl/wordpress/2007/08/12/winsock-tutorial-3-serwer/
wyszły mi takie oto kody:
serwer:

#undef UNICODE

#define WIN32_LEAN_AND_MEAN

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

using namespace std;

// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")


int main(){
	//string port = "27015";
	WSADATA wsaData;
	SOCKET gniazdoNasluchu = INVALID_SOCKET, gniazdoKlienta = INVALID_SOCKET;
	struct addrinfo hints, *result;

	if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
		cout << "Blad inicjalizacji WinSock" << endl;
		return 1;
	}



	ZeroMemory(&hints, sizeof (hints));
	hints.ai_family = AF_INET;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = IPPROTO_TCP;
	hints.ai_flags = AI_PASSIVE;

	if(getaddrinfo(NULL, "27015", &hints, &result) != 0){
		    cout << "informacje gniazda niepowodzenie" << endl;
			WSACleanup();
			return 1;
	}



	gniazdoNasluchu = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
	if(gniazdoNasluchu == INVALID_SOCKET){
		cout << "Nie mozna stworzyc ucha" << endl;
		WSACleanup();
		return 1;
	}



	if(bind(gniazdoNasluchu, result->ai_addr, result->ai_addrlen) == SOCKET_ERROR){
		cout << "powiazanie nieudane" << endl;
		freeaddrinfo(result);
		closesocket(gniazdoNasluchu);
        WSACleanup();
        return 1;
	}



	if ( listen(gniazdoNasluchu, 20) == SOCKET_ERROR ) {
		cout << "sluchanie nieudane" << endl;
		closesocket(gniazdoNasluchu);
		WSACleanup();
		return 1;
	}



	gniazdoKlienta = accept (gniazdoNasluchu, NULL, NULL);

	if(gniazdoKlienta == INVALID_SOCKET){
		cout << "Niepoprawne połączenie!" << endl;
		closesocket(gniazdoKlienta);
		closesocket(gniazdoNasluchu);
		WSACleanup();
		return 1;
	}
	string wiadomosc = "witamy na serwerze";
	send(gniazdoKlienta, wiadomosc.c_str(),  wiadomosc.length()+1, 0);

	closesocket(gniazdoKlienta);
	WSACleanup();

    return 0;
} 

klient:

 #undef UNICODE

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")

int main(){
	WSADATA wsaData;
	addrinfo hints, *result;
	SOCKET gniazdo = INVALID_SOCKET;

	if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
		cout << "Blad inicjalizacji WinSock" << endl;
		return 1;
	}
	


	ZeroMemory(&hints, sizeof (hints));
	hints.ai_family = AF_INET;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = IPPROTO_TCP;
	hints.ai_flags = AI_PASSIVE;

	if(getaddrinfo("192.168.1.101", "27015", &hints, &result) != 0){
		    cout << "informacje gniazda niepowodzenie" << endl;
			WSACleanup();
			return 1;
	}



	gniazdo = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
	if(gniazdo == INVALID_SOCKET){
		cout << "Nie mozna stworzyc gnazda" << endl;
		WSACleanup();
		return 1;
	}



	if(connect(gniazdo, result->ai_addr, result->ai_addrlen) == SOCKET_ERROR){
		closesocket(gniazdo);
		gniazdo = INVALID_SOCKET;
	}

	if(gniazdo == INVALID_SOCKET){
		cout << "brak polaczenia z serwerem" << endl;
		WSACleanup();
		return 1;
	}


	char bufor[20];

	recv(gniazdo, bufor, 20, 0);
	cout << bufor << endl;

    return 0;
}

Problem jest tego typu, że na jednym kompie (laptopie), chce to działać, zaś na drugim nie bardzo, tzn jak odpalam program ze swoim IP to działa fajnie, zaś jeśli serwer odpalę na drugim kompie(PC) w mojej sieci to niestety nie ma żadnej komunikacji. Mało tego jeśli klienta i serwer odpalę na PC to też nie działa, chyba że jako adres IP podam "127.0.0.1". Zaznaczę jeszcze, że na PC odpalałem aplikacje kompilowane na laptopie, jeśli kompiluje na PC to serwer od razu się zamyka wyrzucając błąd przy funkcji bind(); . Nie wiem co może być przyczyną, to moja pierwsza aplikacja gdzie chciałem poznać sockety. Dodam że na obu komputerach jest Win7 a kompilowałem w Visual Studio 11 Developer Preview

0

Jeżeli żadna funkcja nie zwraca błędu to powinno działać... problem jest prędzej w konfiguracji sieci, firewall, av, poblokowane porty. Sprawdz np czy w jakiejś grze jest połączenie między komputerami.

http://firsthost.nazwa.pl/wordpress/2007/08/12/winsock-tutorial-3-serwer/
http://firsthost.nazwa.pl/wordpress/2007/08/01/winsock-tutorial-2-laczenie-z-hostem/

Odpal ten kod, jestem pewny, że działa bo sam na nim bazowałem. Pozdro

0

chwilowo nie mam dostępu do PC, ale sprawdzę jak tylko będę mógł. Jeszcze mam pytanie, a jak się robi taką aplikację klient - serwer, ale żeby nie przez sieć wewnętrzną tylko przez internet się łączyło. Wtedy podaje się IP to które dostaję od usługodawcy internetu?

0

Tak, musisz mieć zewnętrzny adres IP. Jeżeli Twój komputer(host) jest za routerem, musisz też ustawić przekierowanie portu np 5555 na lokalne IP Twojego komputera(hosta).

0

na PC coś jest jednak pochrzanione, bo nie chce tam działać tzn klient nie łączy się z serwerem w ogóle. Na laptopie chce działać ale ma problem z wyjściem poza brame rutera. Mam pytanie jeszcze odnośnie tego przekierowania portu o którym wspomniałeś to robi się robi tak jak zrobiłem w załączniku, port oczywiście analogiczny do tego z aplikacji (screen w załączniku)? Bo jakoś nie idzie mi to, nie wiem która to opcja w panelu administracyjnym, a w googlach nie wiem pod jakim haslem tego szukać...

0

Tak, w ten sposób przekierowałeś port na adres IP swojego komputera. Jeżeli nadal nie działa spróbuj jeszcze odblokować port w "port triggering". Jak podajesz adres ip swojego komputera(nie 127.0.0.1) to normalnie się łączy? Poza tym, wydaje mi się, że jeżeli komputery z sieci lan nie mogą się połączyć to klienci z zewnątrz tym bardziej. Zajmij się na razie problemem lan-a.

0

w sieci komputery się widzą i mają komunikację między sobą (ale nie przez mój program), tzn mogę pingować jednym komputerem drugi, i pliki też się przesyłają. Jeśli łączę się przez "127.0.0.1" to działa tak jak należy. Mógłbyś mi powiedzieć o co chodzi w tym Port Range Triggering, bo nie do końca wiem co się tam przestawia i ewentualnie jak to przestawić?

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