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

[SFML]Problem z powtarzającym się tekstem(sieć)

Ostatnio zmodyfikowano 2015-05-31 10:30
Autor Wiadomość
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:
C/C++
#include <SFML\Network.hpp>
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    sf::UdpSocket server;
    unsigned short s = 5601; //Port serwera
    unsigned short c = 5602; //Port clienta
    server.bind( s ); //ustawienie portu serwera
    string tmp = ""; //zmienna zapisywująca pakiet przychodzacy
    string nick = "";
    sf::Packet pak; //pakiet do zapisywania informacji o przychodzącyh
    sf::IpAddress ip_c = sf::IpAddress::getLocalAddress(); //adres ip clienta
   
    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:
C/C++
#include <SFML\Network.hpp>
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    sf::UdpSocket client; //stworzenie gniazda clienta
    unsigned short s = 5601; //port serwera
    unsigned short c = 5602; //port clienta
    client.bind( c ); //przypiswanie portu clienta
    string tmp; //string do wyslania
    string nick;
    sf::Packet pak; //stworzenie pakietu
    sf::IpAddress ip_s = sf::IpAddress::getLocalAddress(); //adres ip clienta
    //wiadomosc w pakiecie do wyslania
   
    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 ) //wyslij pakiet na ip i port serwera
        {
            cout << "Dane nie zostaly wyslane!\n";
        }
    }
}
P-132974
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:

C/C++
std::cin.clear();
std::cin.sync();
P-132980
haper
Temat założony przez niniejszego użytkownika
» 2015-05-30 18:43:16
Mimo to problem nadal wystepuje.
P-132984
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:
C/C++
///////// Serwer /////////

sf::UdpSocket socket;
// jakies tam manewry na socket
socket.setBlocking( false );

while( petla glowna )
{
    if( socket.receive(...) == sf::Socket::Done )
    {
        cout << "Odebrane dane: " <<...;
    }
}

///////// Client /////////

sf::UdpSocket socket;
// jakies tam manewry na socket
socket.setBlocking( false );

while( petla glowna )
{
    cin >> dane;
    packet.clear();
    packet << dane;
   
    if( socket.send(...) == sf::Socket::Done )
    {
        cout << "Wyslano!" << endl;
    }
}
P-133005
« 1 »
  Strona 1 z 1