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

[SFML 2.X] TCP/IP - Jak napisać prostego klienta

Ostatnio zmodyfikowano 2024-11-19 18:20
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML 2.X] TCP/IP - Jak napisać prostego klienta
» 2024-11-18 23:35:14
Witam. Uczę się komunikacji TCP/IP. Napisałem prosty server, który nasłuchuje na porcie 53000 i oczekuje połączenia z klientem.
Potrzebuję napisać prostego klienta, który połączy się z serverem oraz wyśle mu tekst "Hello!". Pomożecie ?
Poza tym mam jeszcze pytanie dlaczego port akurat 53000? Jakie wartości może przyjmować port itp.

Kod mojego "servera":

C/C++
#include <iostream>
#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
using namespace std;

sf::RenderWindow * window;
sf::TcpListener listener;

int main()
{
   
window = new sf::RenderWindow( sf::VideoMode( 720, 480 ), "SERVER" );
   
window->setFramerateLimit( 5 );
   
   
sf::IpAddress localIP = sf::IpAddress::getLocalAddress();
   
sf::IpAddress publicIP = sf::IpAddress::getPublicAddress();
   
   
cout << "Adres IP lokalny (LAN): " << localIP << "\n";
   
cout << "Adres IP publiczny: " << publicIP << "\n";
   
   
if( listener.listen( 53000 ) != sf::Socket::Done ) {
       
cout << "Nie udało się nasłuchiwać na porcie 53000\n";
       
return - 1;
   
}
   
   
cout << "Server listening on 53000\n";
   
   
bool waiting_for_client = true;
   
   
while( window->isOpen() )
   
{
       
       
while( waiting_for_client == true ) {
           
           
sf::TcpSocket client;
           
if( listener.accept( client ) != sf::Socket::Done ) {
               
cout << "not connecting\n";
               
return - 1;
           
}
           
           
cout << "client " << client.getRemoteAddress() << " conecting\n";
           
waiting_for_client = false;
       
}
       
       
sf::Event event;
       
while( window->pollEvent( event ) ) {
           
if( event.type == sf::Event::Closed ) {
               
window->close();
           
}
        }
       
       
       
window->clear();
       
window->display();
       
   
}
   
return 0;
}
P-181922
pekfos
» 2024-11-19 16:38:17
Kodu tyle co nic. Skoro to napisałeś, to co cię powstrzymuje przed napisaniem klienta? Robisz connect() i wysyłasz dane...

Poza tym mam jeszcze pytanie dlaczego port akurat 53000? Jakie wartości może przyjmować port itp.
Bo tak się napisało. Może być dowolna liczba 16-bitowa bez znaku, różna od zera, która nie jest obecnie w użyciu w systemie. Jak masz wybrać na stałe, najlepiej w zakresie 1024-32767. Poniżej możesz potrzebować uprawnień administratora, a powyżej są zakresy losowo przydzielanych portów.
P-181927
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-19 18:18:42
Ok. Czyli jak rozumiem dobrą praktyką podczas Tworzenia listenera będzie sprawdzenie portów przed utworzeniem servera ?
Klienta napisałem i działa :-)

Server
C/C++
#include <iostream>
#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
using namespace std;

sf::RenderWindow * window;
sf::TcpListener listener;
sf::TcpSocket client1;

int main()
{
   
window = new sf::RenderWindow( sf::VideoMode( 720, 480 ), "SERVER" );
   
window->setFramerateLimit( 5 );
   
   
sf::IpAddress localIP = sf::IpAddress::getLocalAddress();
   
sf::IpAddress publicIP = sf::IpAddress::getPublicAddress();
   
   
cout << "Adres IP lokalny (LAN): " << localIP << "\n";
   
cout << "Adres IP publiczny: " << publicIP << "\n";
   
   
if( listener.listen( 53000 ) != sf::Socket::Done ) {
       
cout << "Nie udało się nasłuchiwać na porcie 53000\n";
       
return - 1;
   
}
   
   
cout << "Server listening on 53000\n";
   
   
bool waiting_for_client = true;
   
   
while( window->isOpen() )
   
{
       
       
while( waiting_for_client == true ) {
           
           
           
if( listener.accept( client1 ) != sf::Socket::Done ) {
               
cout << "not connecting\n";
               
return - 1;
           
}
           
           
cout << "client " << client1.getRemoteAddress() << " conecting\n";
           
waiting_for_client = false;
       
}
       
       
bool server_run = true;
       
       
while( server_run ) {
           
           
// Próba odbioru wiadomości
           
char buffer[ 100 ]; // Bufor do przechowywania wiadomości
           
std::size_t received; // Ilość odebranych bajtów
           
           
if( client1.receive( buffer, sizeof( buffer ), received ) != sf::Socket::Done ) {
               
cout << "Error receiving message\n";
           
}
           
else {
               
cout << "Received message: " << buffer << "\n";
           
}
        }
       
       
sf::Event event;
       
while( window->pollEvent( event ) ) {
           
if( event.type == sf::Event::Closed ) {
               
window->close();
           
}
           
           
cout << "nasłuchuję ... \n";
           
           
       
}
       
       
       
window->clear();
       
window->display();
       
   
}
   
return 0;
}

Klientp
C/C++
#include <iostream>
#include <SFML/System.hpp>
#include <SFML/Network.hpp>
using namespace std;

int main() {
   
// Tworzymy obiekt socketu
   
sf::TcpSocket socket;
   
   
// Łączymy się z serwerem (adres IP serwera i port 53000)
   
sf::IpAddress serverIP = "192.168.97.73"; // Adres IP lokalnego hosta (możesz zmienić na IP serwera)
   
unsigned short port = 53000;
   
   
// Próba połączenia z serwerem
   
if( socket.connect( serverIP, port ) != sf::Socket::Done ) {
       
cout << "Nie udało się połączyć z serwerem\n";
       
return - 1;
   
}
   
   
cout << "Połączono z serwerem: " << serverIP << ":" << port << "\n";
   
   
// Wiadomość do wysłania
   
std::string message = "Hello!";
   
   
int i = 0;
   
while( true ) {
       
// Wysyłamy wiadomość do serwera
       
if( socket.send( message.c_str(), message.length() + 1 ) != sf::Socket::Done ) {
           
cout << "Nie udało się wysłać wiadomości\n";
           
return - 1;
       
} else
           
 cout << "send - \"Hello!\\n";
       
       
sf::sleep( sf::seconds( 1 ) );
   
}
   
   
// Zamknięcie połączenia z serwerem
   
socket.disconnect();
   
   
return 0;
}
P-181930
« 1 »
  Strona 1 z 1