[SFML Network] Błąd z połączeniem dwóch komputerów
Ostatnio zmodyfikowano 2013-10-24 20:08
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) #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ą ? |
|
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. |
|
DejaVu |
» 2013-10-23 20:23:15 Testuj aplikację kliencką i serwer na tym samym komputerze, a dopiero potem testuj zdalne połączenia. |
|
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ć ?? |
|
pekfos |
» 2013-10-24 16:42:50 Jeśli oba komputery są w sieci lokalnej, nie musisz niczego przekierowywać. Sprawdź, czy firewall nie blokuje. |
|
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. |
|
« 1 » |