[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 |