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