Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[winsock] Nie można się połączyć

Ostatnio zmodyfikowano 2010-09-11 11:37
Autor Wiadomość
pekfos
Temat założony przez niniejszego użytkownika
[winsock] Nie można się połączyć
» 2010-09-11 10:56:55
napisałem prosty serwer do gry multiplayer i klienta. Jednak gdy uruchamiam serwer na moim komputerze(win Vista) a klienta na innym komputerze(win XP) i podaje do klienta adres IP serwera (adres mojego komputera, uzyskany poleceniem ipconfig)
to po dość długiej chwili w ekranie konsoli wyświetla się błąd "Nie można się połączyć".
Oto kod serwera:
C/C++
#include <winsock2.h>
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;

const int port = 4214;

WORD version;
WSADATA wsa;
SOCKET listener, server, sclient;
sockaddr_in local;
sockaddr_in client;

string sayhi = "witamy na naszym serwerze";

int main() {
    cout << "rozpoczynanie inicjalizacji serwera.." << endl;
    version = MAKEWORD( 2, 2 );
    if( WSAStartup( version, & wsa ) ) {
        cout << "Blad inicjalizacji WSA" << endl;
        WSACleanup();
        getch();
        return 1;
    }
    if( LOBYTE( wsa.wVersion ) != 2 || HIBYTE( wsa.wVersion ) != 2 ) {
        cout << "Blad: nieprawidlowa wersja" << endl;
        WSACleanup();
        getch();
        return 1;
    }
    listener = socket( AF_INET, SOCK_STREAM, IPPROTO_IP );
    if( listener == SOCKET_ERROR ) {
        cout << "Blad tworzenia nasłuchu" << endl;
        WSACleanup();
        getch();
        return 1;
    }
    memset( & local, 0, sizeof( local ) );
    local.sin_addr.s_addr = htonl( INADDR_ANY );
    local.sin_family = AF_INET;
    local.sin_port = htons(( u_short ) port );
   
    if( bind( listener,( sockaddr * ) & local, sizeof( local ) ) == SOCKET_ERROR ) {
        cout << "Blad: nieprawidlowy przebieg bindu" << endl;
        closesocket( listener );
        WSACleanup();
        getch();
        return 1;
    }
    if( listen( listener, SOMAXCONN ) == SOCKET_ERROR ) {
        cout << "Blad zakladania nasluchu" << endl;
        closesocket( listener );
        WSACleanup();
        getch();
        return 1;
    }
    cout << "nasluchiwanie.." << endl;
    int sockaddr_size = sizeof( client );
    sclient = accept( listener,( sockaddr * ) & client, & sockaddr_size );
    if( sclient == INVALID_SOCKET ) {
        cout << "Blad: niepoprawne polaczenie" << endl;
        closesocket( sclient );
        closesocket( listener );
        WSACleanup();
        getch();
        return 1;
    }
    cout << "polaczono! wysylanie danych.." << endl;
    send( sclient, sayhi.c_str(), sayhi.size() + 1, 0 );
    cout << "wyslano." << endl;
   
    closesocket( sclient );
    closesocket( listener );
    WSACleanup();
    cout << "serwer wylaczony" << endl;
    return 0;
}

Klient:
C/C++
#include <winsock2.h>
#include <iostream>
#include <conio.h>
using namespace std;

const int port = 4214;
const int max_buffer = 2048;
char buffer[ max_buffer ];

WSADATA wsa;
SOCKET sclient;

int main() {
    if( WSAStartup( MAKEWORD( 2, 2 ), & wsa ) ) {
        cout << "Blad inicjalizacji WSA" << endl;
        WSACleanup();
        getch();
        return 1;
    }
    if( LOBYTE( wsa.wVersion ) != 2 || HIBYTE( wsa.wVersion ) != 2 ) {
        cout << "Blad: nieprawidlowa wersja" << endl;
        WSACleanup();
        getch();
        return 1;
    }
    sclient = socket( AF_INET, SOCK_STREAM, IPPROTO_IP );
    if( sclient == INVALID_SOCKET ) {
        cout << "Blad tworzenia socketa" << endl;
        WSACleanup();
        getch();
        return 1;
    }
    hostent * host = 0;
   
    char szserver[ 64 ];
    cout << "podaj IP serwera: " << endl;
    cin >> szserver;
   
    sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port =( u_short ) port;
    server.sin_addr.s_addr = inet_addr( szserver );
   
    if( server.sin_addr.s_addr == INADDR_NONE ) {
        host = gethostbyname( szserver );
        if( host == NULL ) {
            cout << "Blad konwersji adresu: " << szserver << endl;
            closesocket( sclient );
            WSACleanup();
            getch();
            return 1;
        }
        CopyMemory( & server.sin_addr.s_addr, host->h_addr_list[ 0 ], host->h_length );
    }
   
    if( connect( sclient,( sockaddr * ) & server, sizeof( server ) ) == SOCKET_ERROR ) {
        cout << "Blad: nie mozna sie polaczyc" << endl;
        closesocket( sclient );
        WSACleanup();
        getch();
        return 1;
    }
    cout << "polaczono" << endl;
    recv( sclient, buffer, max_buffer, 0 );
    cout << buffer << endl;
   
    closesocket( sclient );
    WSACleanup();
    getch();
    return 0;
}

Jeżeli błąd wynika z nieprawidłowego IP to w jaki sposób w serwerze wyświetlić jego adres by klienci mogli się z nim połączyć?

//edit: Jeśli to ma związek ze sprawą to oba komputery ciągną internet z tego samego rutera.
P-21893
DejaVu
» 2010-09-11 11:10:30
Jeżeli komputery są w sieci lokalnej to powinno działać. Jeżeli nie są to należy przekierować określony port na routerze na konkretny adres IP (oczywiście ip lokalne). Jeżeli modem jest podłączony bezpośrednio do komputera IP powinno być zewnętrzne, więc nic nie trzeba robić. Oczywiście w obu przypadkach trzeba odblokować w systemie zabezpieczeń dostęp do określonego portu (firewall), bądź go wyłączyć żeby było na początek łatwiej zdiagnozować przyczynę. Dodam również, że jeżeli masz sieć osiedlową to nici z połączenia klient/serwer bowiem sieci lokalne nie przydzielają zewnętrznego IP. Co najwyżej możesz podreptać do firmy i poprosić o przekierowanie kilku portów na Twoje IP byś mógł zakładać serwer i był on jednocześnie widoczny dla komputerów spoza sieci lokalnej - szanse są jednak małe, bowiem jest to zabieg ograniczający zbędny wychodzący ruch sieciowy, który w przypadku sieci osiedlowych należy szanować bowiem jedno łącze jest współdzielone przez wielu użytkowników.
P-21894
pekfos
Temat założony przez niniejszego użytkownika
» 2010-09-11 11:33:00
to nie jest sieć osiedlowa. Ruter podłączony do gniazdka telefonicznego.
Serwer jest dodany do listy wyjątków firewalla.
Co do IP to nie wiem czy jest zewnętrzne..
P-21896
DejaVu
» 2010-09-11 11:37:52
Poczytaj w takim razie o konfiguracji routera, a konkretniej przekierowywanie portów.
P-21898
« 1 »
  Strona 1 z 1