[SFML2.0] TCP
Ostatnio zmodyfikowano 2013-08-03 14:19
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: 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 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; }
|
|
MrPoxipol |
» 2013-07-24 09:03:41 Hm, a spróbuj jeszcze wysłać znaki nowej lini '\r\n'. |
|
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? |
|
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ę. |
|
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? |
|
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. |
|
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ś. |
|
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. |
|
« 1 » 2 |