Parapet Temat założony przez niniejszego użytkownika |
SFML Network - Klient i Serwer w oddzielnej aplikacji. » 2014-11-01 17:06:44 Witam! Aktualnie próbuję napisać serwer który będzie wysyłał dane do klienta przez TCP. Kod wysyłania: bool Server::sendInfo( sf::IpAddress ip, char data[], int datasize ) { if( socket.connect( ip, port ) != sf::Socket::Done ) { std::cout << "Can't connect! IP: " << ip << " Port: " << port << std::endl; return false; } if( socket.send( data, datasize ) != sf::Socket::Done ) { std::cout << "Can't send data!" << std::endl; return false; } return true; }
Jak mam napisać klienta który będzie odbierał te dane? Jakiej klasy użyć TcpSocket czy może TcpListner? Czytam dokumentację i nie wiem jak to zrobić ;( Pozdrawiam! |
|
czosnek17 |
» 2014-11-01 18:10:32 |
|
Parapet Temat założony przez niniejszego użytkownika |
» 2014-11-02 08:30:50 sf::TcpSocket a; char data[] = "HelloWorld123/"; int datas = 25; sf::IpAddress him( "94.251.195.41" ); if( a.connect( him, 5569 ) != sf::Socket::Done ) std::cout << "Something was wrong! [1]" << std::endl;
else { if( a.send( data, datas ) != sf::Socket::Done ) std::cout << "Something was wrong! [2]" << std::endl; }
std::cout << "Done" << std::endl; char x; std::cin >> x; return 0;
To jest serwer. A jak odebrać go w kliencie? Proszę o jakiś kod czy podpowiedzi. Tak widziałem ten link, nie pomogło ;( |
|
czosnek17 |
» 2014-11-02 21:15:02 Raczej na odwrót. Używasz tu funkcji connect, a to klient powinien łączyć się -> do serwera. Serwer nasłuchuje, czy ktoś nie chce się połączyć, jeżeli tak, to akceptuje połączenie i połączenie jest utrzymywane (TCP). sf::IpAddress him( "94.251.195.41" );
Nie wiem czy ten adres to jakiś przypadek, mam nadzieję, że testujesz na localhoście? 1. Łączenie: sf::TcpListener listener; sf::TcpSocket client_1;
listener.listen( 55001 ); listener.accept( client_1 ); cout << "Nowe połączenie: " << client_1.getRemoteAddress() << endl;
sf::TcpSocket socket; socket.connect( ip, port ); cout << "polaczono\n";
2. Odbieranie i wysyłanie: string message; client_1.send( message.c_str(), message.size() + 1 );
char bufor[ 2500 ]; size_t received = 0; client_1.receive( bufor, sizeof( bufor ), received );
string message; sss->socket.send( message.c_str(), message.size() + 1 );
char buffer[ 2500 ]; size_t received = 0; sss->socket.receive( buffer, sizeof( buffer ), received );
Wyciąłem fragmenty kodu z mojego starego (ma GUI, ale kod sieciowy jest prymitywny) komunikatora, jutro podłączę umierający dysk, bo chyba zapomniałem skopiować kod nowego więc dzięki za przypomnienie :) Tak to wygląda ogólnie i najprościej. Serwer czeka, klient się łączy, serwer akceptuje i dalej można się komunikować. PS: polecam sf::Packet. |
|
Parapet Temat założony przez niniejszego użytkownika |
» 2014-11-03 14:52:01 Oczywiście adres IP to przypadek ;) Dziękuję bardzo za wytłumaczenie po "chłopsku" ;) Czy mógł byś mi pomóc przy UDP ale poprzez maila lub gg? ew. jak chcesz może pokazać mi jak serwer wysyła informacje do klientów (około 5) a klient je odbiera ;) Był bym bardzo wdzięczny ;)
mail: wasdxd(at)poczta(dot)pl //gdyby administracja/moderatorzy mogli by tego nie usuwać ;) |
|
czosnek17 |
» 2014-11-03 20:00:04 ew. jak chcesz może pokazać mi jak serwer wysyła informacje do klientów
|
W UDP jest prościej, niż w TCP. Nie trzeba tworzyć klienta i serwera, akceptować połączeń, nasłuchiwać itd.
|
No na przykład tak jak w lekcji w podpunkcie Komunikacja za pomocą UDP, ale jeżeli masz kilka odbiorców to można zrobić tablicę adresów i portów docelowych. sf::UdpSocket sock; sf::IpAddress ip[ 5 ]; unsigned int port[ 5 ];
for( int i = 0; i < 5; i++ ) sock.send( data, datasize, ip, port[ i ] );
sock.bind( port ); sock.receive( data, datasize, received, ip, port );
|
|
Parapet Temat założony przez niniejszego użytkownika |
» 2014-11-03 20:18:48 Nie zamykam ponieważ będę miał jeszcze pytania :) |
|
Parapet Temat założony przez niniejszego użytkownika |
» 2014-11-04 18:31:58 #include <SFML/Graphics.hpp> #include <SFML/Network.hpp> #include <iostream> int main() { sf::UdpSocket socket; sf::IpAddress ip = "192.168.1"; char data[ 24 ]; std::size_t datas; std::size_t recived; socket.bind( 9898 ); short unsigned port = 9898; socket.receive( data, datas, recived, ip, port ); std::cout << data << std::endl; std::cout << recived << std::endl; std::cout << datas << std::endl; }
Dwie oddzielne aplikacje a Krzysiek nie odebrał danych ;( Gdzie jest wina? |
|
« 1 » 2 3 4 |