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

[SFML2.0] TCP

Ostatnio zmodyfikowano 2013-08-03 14:19
Autor Wiadomość
polkom21
Temat założony przez niniejszego użytkownika
[SFML2.0] TCP
» 2013-07-23 23:46:38
Cześć. Ostatnio piszę sobie tak w SFML i myślę czemu by nie przetestować jak to by było z komunikacją sieciową. Coś tam udało mi się wykombinować ale to nie chce działać i nie wiem czemu. Mam serwer i klienta. Na serwerze obecnie tylko odbieram wiadomość z klienta i działa tylko do tego momentu, że odbiera jedną wiadomość a następnej już nie odbiera. Sprawdzałem może jakiś błąd się pojawia albo coś ale nic. Serwer i klient działają ok tylko serwer nie odbiera następnej wiadomości. Jestem laikiem jeżeli chodzi o sprawy sieciowe więc możliwe, że jakąś małą gafę strzeliłem. Jest jeszcze taki problem, że wysyłać można zmienne typu char a jak w wiadomości pojawia się spacja to resztę ucina.

SERVER:
C/C++
int main()
{
    bool run = true;
    sf::TcpListener listen;
    if( listen.listen( 25565 ) != sf::Socket::Done ) printf( "ERROR: Don't have create server!\n" );
   
    sf::TcpSocket socket;
    int online = 0;
    char message[ 128 ];
    std::size_t received;
    while( run )
    {
        if( listen.accept( socket ) == sf::Socket::Done )
        {
            std::cout << "Client connected (" << socket.getRemoteAddress() << ").\n";
            online++;
        }
        socket.receive( message, sizeof( message ), received );
        if( sizeof( message ) > 0 ) std::cout << message << std::endl;
       
    }
}

client
C/C++
int main()
{
    sf::IpAddress server = "localhost";
    sf::TcpSocket socket;
    bool run = false;
    if( socket.connect( server, 25565 ) == sf::Socket::Done ) run = true;
   
    while( run )
    {
        char message[ 128 ];
        std::cin >> message;
        if( socket.send( message, sizeof( message ) ) != sf::Socket::Done ) std::cout << "Blad wysylania wiadomosci!\n";
       
    }
    return 0;
}
P-88649
MrPoxipol
» 2013-07-24 09:03:41
Hm, a spróbuj jeszcze wysłać znaki nowej lini '\r\n'.
P-88652
polkom21
Temat założony przez niniejszego użytkownika
» 2013-07-24 12:38:55
Wysyłana wiadomość ma tym char więc jak wyślę coś takiego: "\n" to oczywiste, że na serwerze wyświetli "\n". Jakieś pomysły co do wyświetlania tylko jednej wiadomości?
P-88656
Admixior
» 2013-07-24 13:01:10
Kod serwera mówi sam za siebie:
1. poczekaj i połącz użytkownika
2. odbierz jedną wiadomość
3. idź do kroku nr 1

Więc klienta nie rozłączasz tylko od razu po odebraniu czekasz na nowego klienta.
"Poczekaj i połącz użytkownika" wyrzuć przed pętlę.
P-88657
polkom21
Temat założony przez niniejszego użytkownika
» 2013-07-24 13:55:56
Pisałem, że laikiem jestem dopiero się uczę. Dobra a teraz jak sprawdzić czy klient nie rozłączył się z serwera? Co zrobić aby serwer obsługiwał więcej niż jednego klienta na raz?
P-88661
RazzorFlame
» 2013-07-24 16:44:03
Zobacz co to Selector. Z resztą w tutorialu na stronie sfml-dev.org jest to wyjaśnione. Pisałeś że ignoruje wszystko po spacji. Tak działa
std::cin
 wczytuje wszystko do spacji. Jeśli chcesz sie przekonać że tak jest to zanim wyślesz to, to wypisz zawartość message na ekran. Jeśli chcesz wczytywać całą linie wykorzystaj funkcje getline.
P-88675
Admixior
» 2013-07-24 16:44:22
Masz 3 wybory:
1. zrobić kilka wątków (a i tu musisz bardzo uważać żeby naraz dwa nie zmieniały NARAZ jakichś danych)(niezbyt dobre rozwiązanie)

2. zrobić gniazda nieblokujące (nie wiem jak to jest z tym w SFML)

3. (rozwiązanie to co @up)

Ale jeśli chcesz obsłużyć kilku klientów najłatwiej przejść z TCP na UDP. I nie ma problemu.
Wtedy tylko za każdym razem dostajesz ip od kogo odebrałeś.
P-88676
polkom21
Temat założony przez niniejszego użytkownika
» 2013-07-24 22:13:57
@RazzorFlame skapnąłem się zaraz po napisaniu postu na forum.
Jak znajdę chwilę to przepisze wszystko na UDP i zobaczę jak mi to wyjdzie. Jak napiszę to dam znać co z tego wyszło.
P-88708
« 1 » 2
  Strona 1 z 2 Następna strona