domin568 Temat założony przez niniejszego użytkownika |
» 2013-12-13 16:17:20 Najprostszy przykład działa tzn : #include "stdafx.h" #include <SFML/Network.hpp> #include <iostream>
using namespace std; sf::Packet packet_send; sf::Packet packet_receive; char data_send[ 100 ]; char data_receive[ 100 ]; sf::UdpSocket socketUDP; sf::IpAddress local_host = sf::IpAddress::LocalHost; unsigned short port_receive; unsigned short port_send = 54001; sf::Mutex mutex;
int _tmain( int argc, _TCHAR * argv[] ) { cout << "Client" << endl; if( socketUDP.bind( 54000 ) == sf::Socket::Done ) { cout << "Binded for port : " << "54000" << endl; } while( true ) { cin.getline( data_send, 100 ); packet_send.clear(); packet_send << data_send; cout << packet_send.getDataSize() << endl; if( socketUDP.send( data_send, 100, local_host, port_send ) == sf::Socket::Done ) { cout << "Succesfull send data" << endl; } else { cout << "Unsuccesfull data send" << endl; } } return 0; }
Jak widać usunąłem tylko wątek odbioru. Wiadomość się wysyła, i jest przyjmowana na drugiej aplikacji, no jednak już na clienta nie można nic wysłać bo nie ma wątku odbioru, no a to ma być komunikator :P. Wszystko w tym psuje ten wątek, próbwałem napisać to w C++ z użyciem biblioteki thread, ale tam ten wątek nie działa tak jak w sfml (tzn nie działa współbieżnie) albo nie umiem tego tak zrobić. Macie jakieś pomysły :) ?? |
|
DejaVu |
» 2013-12-14 02:55:17 1. Klient powinien używać portu automatycznego. 2. Serwer powinien używać portu z góry określonego (np. 12345). 3. Klient powinien wysyłać na konkretny port serwera (12345). 4. Serwer powinien wysyłać dane na taki port, na jakim przyszły dane do odebrania. 5. Upewnij się, że wątki do odbierania danych się uruchomiły (wypisz wiadomość przed rozpoczęciem pętli i po jej zakończeniu w kodzie odpowiedzialnym za odbieranie danych w tle). |
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-12-17 20:12:26 Co to znaczy port automatyczny ? sf::Socket::AnyPort ? Problem jest nadal, bo wszystko niszczy ten wątek odbioru, jeżeli go nie ma to nawet wysyłając donikąd dane pisze że z sukcesem zostały wysłane, a jak jest wątek to nie przejdzie za nic ... Nie jest to wina tylko i wyłącznie dlatego że jest to wątek, tylko instrukcji do odbierania (receive) bo jak ją usunę to przejdzie - tak jak tutaj na dole. void receive_data() { std::size_t received; bool wyjscie = false; while( wyjscie != true ) { } }
To jest problem po stronie aplikacji nie po stronie przesyłu danych. Tutaj wklejam cały kod według wskazówek DejaVu : SERVER : #include "stdafx.h" #include <SFML/Network.hpp> #include <iostream>
using namespace std; sf::Packet packet_send; sf::Packet packet_receive; char data_send[ 100 ]; char data_receive[ 100 ]; sf::UdpSocket socketUDP; sf::IpAddress local_host = sf::IpAddress::LocalHost; unsigned short port = 54001;
void receive_data() { std::size_t received; bool wyjscie = false; while( wyjscie != true ) { if( socketUDP.receive( data_receive, 100, received, local_host, port ) == sf::Socket::Done ) { cout << "Receive data" << endl; packet_receive >> data_receive; cout << data_receive << endl; } } } int _tmain( int argc, _TCHAR * argv[] ) { cout << "Server" << endl; if( socketUDP.bind( port ) == sf::Socket::Done ) { cout << "Binded for port : " << "54001" << endl; } sf::Thread watek_odbioru( & receive_data ); watek_odbioru.launch(); while( true ) { cin.getline( data_send, 100 ); packet_send.clear(); packet_send << data_send; cout << packet_send.getDataSize() << endl; if( socketUDP.send( data_send, 100, local_host, port ) == sf::Socket::Done ) { cout << "Succesfull send data" << endl; } else { cout << "Unsuccesfull data send" << endl; } } return 0; }
CLIENT : #include "stdafx.h" #include <SFML/Network.hpp> #include <iostream>
using namespace std; sf::Packet packet_send; sf::Packet packet_receive; char data_send[ 100 ]; char data_receive[ 100 ]; sf::UdpSocket socketUDP; sf::IpAddress local_host = sf::IpAddress::LocalHost; unsigned short port = 54001; sf::Mutex mutex; void receive_data() { cout << "AAA" << endl; std::size_t received; bool wyjscie = false; while( wyjscie != true ) { cout << "AAAAA" << endl; if( socketUDP.receive( data_receive, 100, received, local_host, port ) == sf::Socket::Done ) { cout << "Receive data" << endl; packet_receive >> data_receive; cout << data_receive << endl; } } } int _tmain( int argc, _TCHAR * argv[] ) { cout << "Client" << endl; if( socketUDP.bind( sf::Socket::AnyPort ) == sf::Socket::Done ) { cout << "Binded for AnyPort" << endl; } sf::Thread thread_receive( & receive_data ); thread_receive.launch(); while( true ) { cin.getline( data_send, 100 ); packet_send.clear(); packet_send << data_send; cout << packet_send.getDataSize() << endl; if( socketUDP.send( data_send, 100, local_host, port ) == sf::Socket::Done ) { cout << "Succesfull send data" << endl; } else { cout << "Unsuccesfull data send" << endl; } } return 0; }
Liczę na pomoc :) |
|
DejaVu |
» 2013-12-17 20:38:50 Źle wysyłasz sf::Packet-y... czytałeś kurs SFML-a dot. komunikacji sieciowej?? |
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-12-17 20:42:22 Ale przecież ja nie wysyłam w pakiecie, wysyłam w "płaskich danych" jak to napisałeś wcześniej if( socketUDP.send( data_send, 100, local_host, port_send ) == sf::Socket::Done )
Odkryłem że jeżeli w wątku odbierającym dane zmienie adres IP z local hosta to działa tzn. sf::IpAddress ip = "95.168.26.108"; unsigned short jakis_port = 50000; void receive_data() { std::size_t received; bool wyjscie = false; while( wyjscie != true ) { if( socketUDP.receive( data_receive, 100, received, ip, jakis_port ) == sf::Socket::Done ) { cout << "Receive data" << endl; packet_receive >> data_receive; cout << data_receive << endl; } } }
|
|
DejaVu |
» 2013-12-17 20:45:09 |
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-12-17 22:12:07 IP nadawcy czyli local-host (127.0.0.1) bo narazie aplikacja działa na jednym komputerze, port 54001, ale nie jestem pewien czy to jest dobrze ten port bo coś mówiłeś o porcie automatycznym nie wiem co masz na myśli :D. Może jest to winą tego ze adresy ip servera i clienta sa takie same, to może to blokuje (jeżeli zmienię ip servera to wysyłanie działa) . |
|
DejaVu |
» 2013-12-17 22:31:36 Czemu nie dostosujesz się do tego co napisałem na temat sf::Socket::AnyPort, tylko dalej z uporem 'wymyślasz' własny 'lepszy' sposób odbierania danych... Sam robisz sobie przez to problemy i jeszcze się dziwisz, że nie działa. Tym bardziej, że nadpisujesz sobie co i rusz wartości local_host i port przy odczycie danych. |
|
1 « 2 » 3 |