bleda Temat założony przez niniejszego użytkownika |
Komunikacja za pomocą UDP, serwer nie odpowiada. SFML » 2018-08-10 13:43:25 Witam, mamy taki sam program dla klienta i serwera (Serwer wysyla komunikaty tekstowe). Uruchamiam aplikacje ustawiam jako serwer, robie to samo z klientem. Niestety klient nie łączy się z serwerem. Program jest krótki, wklejam więc go w całości. int main() { sf::IpAddress ip = sf::IpAddress::getLocalAddress(); sf::UdpSocket socket; char connectionType, mode; char bufor[ 2000 ]; size_t received; std::map < unsigned short, sf::IpAddress > computerID; string text = "Polaczono"; cout << ip << endl; cout << " Emter (s) for Server, Enter (c) for client " << endl; cin >> connectionType; unsigned short port; cout << "Podaj numer portu: "; cin >> port; socket.bind( port ); if( connectionType == 's' ) { do { sf::IpAddress rIp; unsigned short port; socket.receive( bufor, sizeof( bufor ), received, rIp, port ); if( received > 0 ) computerID[ port ] = rIp; } while( true ); } else { string sIP; cout << "Podaj adres serwera: "; char c; while( true ) { c =( char ) getch(); if( c == 13 ) break; sIP += c; cout << c; } cout << endl << sIP; sf::IpAddress sendIP( sIP ); socket.send( text.c_str(), text.length() + 1, sendIP, 2000 ); } bool done = false; while( !done ) { if( connectionType == 's' ) { getline( cin, text ); std::map < unsigned short, sf::IpAddress >::iterator tempIterator; for( tempIterator = computerID.begin(); tempIterator != computerID.end(); tempIterator++ ) socket.send( text.c_str(), text.length() + 1, tempIterator->second, tempIterator->first ); } else { sf::IpAddress tempIp; unsigned short tempPort; socket.receive( bufor, sizeof( bufor ), received, tempIp, tempPort ); if( received > 0 ) cout << "Odebrana wiadomosc: " << bufor << endl; } } }
|
|
pekfos |
» 2018-08-10 14:56:39 do { sf::IpAddress rIp; unsigned short port; socket.receive( bufor, sizeof( bufor ), received, rIp, port ); if( received > 0 ) computerID[ port ] = rIp; } while( true ); |
Ta pętla jest nieskończona. string sIP; cout << "Podaj adres serwera: "; char c; while( true ) { c =( char ) getch(); if( c == 13 ) break; sIP += c; cout << c; } |
Um... std::getline()..? To wypada ci po wczytywaniu numeru portu, więc strzelam że to się przyda std::getline() mi nie działa! |
|
bleda Temat założony przez niniejszego użytkownika |
» 2018-08-10 22:09:52 Dokładnie, wypada mi po wpisaniu portu po stronie klienta. Potem powininiem móc (po stronie serwera) wspisać zmienną znak dla przerwania pętli while. Serwer odmawia współpracy ;] Usunąłem getline. Wstawiłem też warunek do pętli. if( connectionType == 's' ) { char znak = 'b'; do { sf::IpAddress rIp; unsigned short port; socket.receive( bufor, sizeof( bufor ), received, rIp, port ); if( received > 0 ) computerID[ port ] = rIp; cin >> znak; } while( znak != 'a' );
} else { string sIP; cout << "Podaj adres serwera: ";
cin >> sIP; cout << endl << sIP; sf::IpAddress sendIP( sIP ); socket.send( text.c_str(), text.length() + 1, sendIP, 2000 ); }
|
|
bleda Temat założony przez niniejszego użytkownika |
» 2018-08-13 10:58:13 Kombinuję jak koń pod góre ;] Probuje zrobić to samo z kodem zamieszczonym w kursie. Metoda receive odmawia wspolpracy. Kod troszke przerobiony z kursu: using namespace std; int main() { sf::UdpSocket sock; sf::IpAddress ip = sf::IpAddress::getLocalAddress(); cout << ip << endl; const int datasize = 100; char data[ datasize ] = "..."; char wybor; cout << "Enter (c) for client, (s) for serwer: " << endl; do { cin >> wybor; if(( wybor != 'c' ) &&( wybor != 's' ) ) cout << "Wybrales: " << wybor << endl << "Enter (c) for client, (s) for serwer: " << endl; } while(( wybor != 'c' ) &&( wybor != 's' ) ); if( wybor == 's' ) { unsigned int port = 56000; char stop; do { if( sock.send( data, datasize, ip, port ) != sf::Socket::Done ) { cerr << "Nie mozna wysylac danych!\n"; exit( 1 ); } cout << "wyslano: " << data << endl; cout << "Enter (s) for stop: "; cin >> stop; } while( stop != 's' ); } if( wybor == 'c' ) { unsigned short port = 54000; unsigned short senderport = 56000; size_t received; sock.bind( port ); cout << "Oczekuje na wiadomosc z IP: " << ip << endl; if( sock.receive( data, 100, received, ip, senderport ) != sf::Socket::Done ) { cerr << "Nie mozna odebrac danych!" << endl; exit( 1 ); } cout << "Odebrano bajtów: " << received << endl; cin >> wybor; } }
Jak widać port w metodzie send jest taki sam jak w receive. Metoda bind wskazuje nam port docelowy dla odbierania wiadomosci.Wszystko wiec jest w porządku o ile dobrze rozumiem. Po kompilacji po stronie klienta mam takie coś :
Enter (c) for client, (s) for serwer: c Oczekuje na wiadomosc z IP:
Po stronie serwera :
Enter (c) for client, (s) for serwer: s wyslano: ... Enter (s) for stop: 1 wyslano: ... Enter (s) for stop: 1 wyslano: ... Enter (s) for stop: 1 wyslano: ... Enter (s) for stop: 1 wyslano: ... Enter (s) for stop:
|
|
bleda Temat założony przez niniejszego użytkownika |
» 2018-08-14 09:04:14 Ostatni przykład żywcem skopiowany z kursu. Dlaczego metoda receive nie dziala? Tzn na niej zawiesza się wykonywanie kodu. Będe wdzieczny za jakąkolwiek pomoc. int main() { sf::UdpSocket sock, sock2; const int datasize = 100; char data[ datasize ] = "...."; sf::IpAddress ipdo = sf::IpAddress::getLocalAddress(); short unsigned int portdo = 5600; if( sock.send( data, datasize, ipdo, portdo ) != sf::Socket::Done ) { cerr << "Nie mozna wyslac danych!\n"; exit( 1 ); } else { cout << "wyslano wiadomosc o tresci: " << data << endl; } sf::IpAddress ipod = sf::IpAddress::getLocalAddress(); short unsigned int portod = 5600; short unsigned int senderport = 5400; unsigned int received; sock2.bind( portod ); cout << "Metoda receive" << endl; if( sock2.receive( data, datasize, received, ipod, senderport ) != sf::Socket::Done ) { cerr << "Nie mozna odebrac danych!\n"; exit( 1 ); } cout << "Odebrano bajtów: " << received << endl; return 0; }
wyslano wiadomosc o tresci: .... Metoda receive
|
|
pekfos |
» 2018-08-14 13:10:50 int main() { sf::UdpSocket sock, sock2; const int datasize = 100; char data[ datasize ] = "...."; short unsigned int portdo = 5600; sock2.bind( portdo ); sf::IpAddress ipdo( "127.0.0.1" ); if( sock.send( data, datasize, ipdo, portdo ) != sf::Socket::Done ) { cerr << "Nie mozna wyslac danych!\n"; exit( 1 ); } else { cout << "wyslano wiadomosc o tresci: " << data << endl; } cout << "Metoda receive" << endl; unsigned int received; sf::IpAddress ipod; short unsigned int senderport; if( sock2.receive( data, datasize, received, ipod, senderport ) != sf::Socket::Done ) { cerr << "Nie mozna odebrac danych!\n"; exit( 1 ); } cout << "Odebrano bajtów: " << received << endl; return 0; } |
|
bleda Temat założony przez niniejszego użytkownika |
» 2018-08-14 14:01:09 Dziękuję Pekfos, dostrzegam jeden swój błąd -> sf::IpAddress ipod = sf::IpAddress::getLocalAddress(); Nie potrzebnie wprowadzam adres ale to raczej szczegół. Dlaczego getLocalAddress i użycie lokalnego Ip nie daje oczekiwanych efektów. |
|
« 1 » |