[SFML]Problem z powtarzającym się tekstem(sieć)
Ostatnio zmodyfikowano 2015-05-31 10:30
haper Temat założony przez niniejszego użytkownika |
[SFML]Problem z powtarzającym się tekstem(sieć) » 2015-05-30 16:42:55 Witam jako iż dopiero zaczynam swoją przygodę z siecią to powstają na mojej drodze pewne problemy, na dzień dzisiejszy tworze mini czat wersja uboga, ogólnie chodzi o to że mam server i clienta, w cliencie podaje nick i tekst który wysyłam, lecz tekst który napisze za pierwszym razem to powtarza się cały czas, co napisze to i tak będzie to samo pisać np. wchodzę w clienta wpisuje nick i tekst : Siemka, w serverze dobrze się wyświetla Nick:Siemka, lecz gdy chce napisać drugi tekst np. hmm to wygląda to tak w serverze Nick:siemka. Screen : http://scr.hu/5nr8/zqa5r Kod servera: #include <SFML\Network.hpp> #include <iostream> #include <conio.h>
using namespace std;
int main() { sf::UdpSocket server; unsigned short s = 5601; unsigned short c = 5602; server.bind( s ); string tmp = ""; string nick = ""; sf::Packet pak; sf::IpAddress ip_c = sf::IpAddress::getLocalAddress(); bool done = false; while( !done ) { if( server.receive( pak, ip_c, c ) != sf::Socket::Done ) { cout << "Dane nie zostaly odebrane!\n"; } pak >> tmp >> nick; cout << nick << ": "; cout << tmp << endl; } }
Kod clienta: #include <SFML\Network.hpp> #include <iostream> #include <conio.h>
using namespace std;
int main() { sf::UdpSocket client; unsigned short s = 5601; unsigned short c = 5602; client.bind( c ); string tmp; string nick; sf::Packet pak; sf::IpAddress ip_s = sf::IpAddress::getLocalAddress(); bool done = false; cout << "Podaj swoj nick: "; cin >> nick; while( !done ) { cout << "Podaj tekst do wyslania: "; cin >> tmp; pak << tmp << nick; if( client.send( pak, ip_s, s ) != sf::Socket::Done ) { cout << "Dane nie zostaly wyslane!\n"; } } }
|
|
kmlkamilek |
» 2015-05-30 18:20:50 Po 1. Zamiast [spoiler][/spoiler], użyj [.cpp][./cpp], oczywiście bez kropek w nawiasach kwadratowych. Po 2. Użyj w pętli u klienta tych metod: std::cin.clear(); std::cin.sync();
|
|
haper Temat założony przez niniejszego użytkownika |
» 2015-05-30 18:43:16 Mimo to problem nadal wystepuje. |
|
RazzorFlame |
» 2015-05-31 10:30:25 Po pierwsze używaj Socketów nieblokujących ( sf::UdpSocket::setBlocking(false)). Pamiętaj, że w tym przypadku nie powinieneś używać komunikatu "Dane nie zostały odebrane" bo po prostu dostaniesz pełno takich komunikatów. Powinno to wyglądać jakoś tak:
sf::UdpSocket socket;
socket.setBlocking( false );
while( petla glowna ) { if( socket.receive(...) == sf::Socket::Done ) { cout << "Odebrane dane: " <<...; } }
sf::UdpSocket socket;
socket.setBlocking( false );
while( petla glowna ) { cin >> dane; packet.clear(); packet << dane; if( socket.send(...) == sf::Socket::Done ) { cout << "Wyslano!" << endl; } }
|
|
« 1 » |