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

[SFML Network] Błąd z połączeniem dwóch komputerów

Ostatnio zmodyfikowano 2013-10-24 20:08
Autor Wiadomość
domin568
Temat założony przez niniejszego użytkownika
[SFML Network] Błąd z połączeniem dwóch komputerów
» 2013-10-23 16:53:34
Witam, zaczynam programowanie sieciowe, jako że chciałbym zrozumieć jak to wszystko działa to pobrałem kod z internetu (wcześniej czytałem wszystkie tutoriale na SFML-dev.org)
C/C++
#pragma comment(lib, "sfml-network.lib")
#include "stdafx.h"
#include <iostream>
#include <SFML/Network.hpp>

const unsigned short PORT = 5000;
const std::string IPADDRESS( "//MOJ  ADRES IP POBRANY Z whatismyipaddress.com" );

std::string msgSend;

sf::TcpSocket socket;
sf::Mutex globalMutex;
bool quit = false;

void DoStuff( void )
{
    static std::string oldMsg;
    while( !quit )
    {
        sf::Packet packetSend;
        globalMutex.lock();
        packetSend << msgSend;
        globalMutex.unlock();
       
        socket.send( packetSend );
       
        std::string msg;
        sf::Packet packetReceive;
       
        socket.receive( packetReceive );
        if( packetReceive >> msg )
        {
            if( oldMsg != msg )
            if( !msg.empty() )
            {
                std::cout << msg << std::endl;
                oldMsg = msg;
            }
        }
    }
}
void Server( void )
{
    sf::TcpListener listener;
    listener.listen( PORT );
    listener.accept( socket );
    std::cout << "New client connected: " << socket.getRemoteAddress() << std::endl;
}
bool Client( void )
{
    if( socket.connect( IPADDRESS, PORT ) == sf::Socket::Done )
    {
        std::cout << "Connected\n";
        return true;
    }
    return false;
}
void GetInput( void )
{
    std::string s;
    std::cout << "\nEnter to quit or message to send: ";
    std::cin >> s;
    if( s == "exit" )
         quit = true;
   
    globalMutex.lock();
    msgSend = s;
    globalMutex.unlock();
}
int main( int argc, char * argv[] )
{
    sf::Thread * thread = 0;
   
    char who;
    std::cout << "Do you want to be a server (s) or a client (c) ? ";
    std::cin >> who;
   
    if( who == 's' )
         Server();
    else
         Client();
   
    thread = new sf::Thread( & DoStuff );
    thread->launch();
   
    while( !quit )
    {
        GetInput();
    }
    if( thread )
    {
        thread->wait();
        delete thread;
    }
    return 0;
}
Gdy na moim komputerze stacjonarnym wybiorę server, a na laptopie clienta to na komputerze stacjonarnym nic się nie dzieje, a na laptopie "Enter to quit or message to send:" jednak bez wcześniejszego Connected !, co może być tego przyczyną ?
P-94394
Mrovqa
» 2013-10-23 17:51:59
Po prostu nie połączyłeś klienta z serwerem, a po stronie klienta sprawdzasz fakt, czy udało się nawiązać połączenie tylko i wyłącznie po to, by wypisać "Connected!" albo nie - i nie ma to wpływu na dalszy przebieg programu. Mimo wszystko próbujesz wysłać dane, nawet w przypadku niepołączonych gniazd.
Jeśli pobrałeś zewnętrzne IP i łączysz się dzięki niemu, to musisz na komputer z aplikacją serwera przekierować porty w routerze tudzież innym urządzeniu, z którego korzystasz. Inna, imho do testów lepsza metoda, łącz się dzięki lokalnemu (wewnętrznemu) IP. Jeśli nadal nie będzie działać, to wielce prawdopodobne jest, iż antywirus/system/firewall blokuje ci połączenia.
P-94408
DejaVu
» 2013-10-23 20:23:15
Testuj aplikację kliencką i serwer na tym samym komputerze, a dopiero potem testuj zdalne połączenia.
P-94417
domin568
Temat założony przez niniejszego użytkownika
» 2013-10-24 15:50:29
Na jednym komputerze wszystko działa tak jak chciałem, ale nadal nie mogę się połączyć między moim komputerem stacjonarnym , a laptopem. Trochę tego wszystkiego nie rozumiem, skoro
listener.listen( PORT );
 to server powinien nasłuchiwać akurat na port np. 5000. A prośba o połączenie ( z laptopa )
socket.connect( IPADDRESS, PORT );
 również ma ten sam port. Dlaczego trzeba przekierowywać porty ?? Mógłby mnie ktoś jakoś naprowadzić ??
P-94453
pekfos
» 2013-10-24 16:42:50
Jeśli oba komputery są w sieci lokalnej, nie musisz niczego przekierowywać. Sprawdź, czy firewall nie blokuje.
P-94456
Mrovqa
» 2013-10-24 20:08:14
Dlaczego trzeba przekierowywać porty ?? Mógłby mnie ktoś jakoś naprowadzić ??
Bo jedna sieć może mieć jedno IP zewnętrzne oraz mnóstwo klientów i trzeba wiedzieć, do kogo przekierować połączenie.
Sprawdź u siebie firewalla (m.in. Windows Defender) oraz antywirusa.
P-94475
« 1 »
  Strona 1 z 1