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

SFML Network - Klient i Serwer w oddzielnej aplikacji.

Ostatnio zmodyfikowano 2014-11-20 22:06
Autor Wiadomość
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:

C/C++
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!
P-119813
czosnek17
» 2014-11-01 18:10:32
Jakiej klasy użyć TcpSocket czy może TcpListner?
TcpSocket

A to widziałeś? :)
http://cpp0x.pl/kursy​/Kurs-SFML-2-x-C++​/Dodatkowe-materialy​/Komunikacja-sieciowa-TCP-i-UD​P​/515
P-119818
Parapet
Temat założony przez niniejszego użytkownika
» 2014-11-02 08:30:50
C/C++
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 ;(
P-119840
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).
C/C++
sf::IpAddress him( "94.251.195.41" );
Nie wiem czy ten adres to jakiś przypadek, mam nadzieję, że testujesz na localhoście?

1. Łączenie:
C/C++
//serwer
sf::TcpListener listener; //tworzymy listener, będzie nasłuchiwał klientow
sf::TcpSocket client_1; //gniazdo, przez to kontaktujemy się z klientem

listener.listen( 55001 ); //czeka tak dlugo, az ktos sie poloczy na podanym porcie
listener.accept( client_1 ); //akceptuje polaczenie i przypisuje je do client_1
cout << "Nowe połączenie: " << client_1.getRemoteAddress() << endl;
C/C++
//klient
sf::TcpSocket socket; //przez to gniazdo laczymy sie z serwerem
socket.connect( ip, port );
cout << "polaczono\n";

2. Odbieranie i wysyłanie:
C/C++
//serwer
string message;
client_1.send( message.c_str(), message.size() + 1 ); //wysylanie

char bufor[ 2500 ];
size_t received = 0;
client_1.receive( bufor, sizeof( bufor ), received ); //odbieranie
C/C++
//klient
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.
P-119888
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ć ;)
P-119919
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.
C/C++
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 ] );

C/C++
//odbieranie
sock.bind( port );
sock.receive( data, datasize, received, ip, port );
P-119947
Parapet
Temat założony przez niniejszego użytkownika
» 2014-11-03 20:18:48
Nie zamykam ponieważ będę miał jeszcze pytania :)
P-119949
Parapet
Temat założony przez niniejszego użytkownika
» 2014-11-04 18:31:58
C/C++
#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
#include <iostream>
int main()
{
    //client
    /*sf::UdpSocket socket;//////////////////////PIERWSZA KOMPILACJA//////////////////////
        sf::IpAddress ip = "192.168.1";
        char data[] = "helloworld!@#123";
        int datas = 25;
        std::cout <<"Uwaga pakiet leci!"<<std::endl;
        socket.send(data, datas, ip, 9898);
        std::cout <<"Krzysiek! Dolecial do ciebie?"<<std::endl;*/ //////////////////////////////*/
    ///////////////////////////DRUGA KOMPILACJA/////////////////////////////
    //serwer
    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;
    //////////////////////////DRUGA KOMPILACJA///////////////////////////////////
}
Dwie oddzielne aplikacje a Krzysiek nie odebrał danych ;(
Gdzie jest wina?
P-119993
« 1 » 2 3 4
  Strona 1 z 4 Następna strona