• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

(SFML) Jak poprawnie napisać server, clienta i rozsyłać im pakiety?

Mały hosting, OGROMNE możliwości
0 głosów
1,187 wizyt
pytanie zadane 21 maja 2015 w C i C++ przez Nasos Bywalec (2,730 p.)

Na wstępie powiem że przeczytałem to http://www.sfml-dev.org/tutorials/2.0/network-socket.php oraz obejrzałem tutorial od CodingMadeEasy, ale w dalszym ciągu nie moge sobie z tym poradzić. Chciałbym aby jednym plikiem odpalało się serwer a innym odpalało się gre i z nim łączyło a po połączeniu żeby ciągle były wysyłane pakiety na serwer a od serwera do reszty graczy. Niestety jak próbuje zrobić jedno to psuje się drugie, co nie dziwne bo niewiele z tej sieciówki rozumiem.

Czy byłby ktoś skłonny napisać prosty kod wysyłający i odbierający jeden pakiet zawierający 2 inty? Tłumaczenia na ten temat również mile widziane :)

1 odpowiedź

+1 głos
odpowiedź 21 maja 2015 przez adrian17 Mentor (354,880 p.)

Zaadaptowane z tutoriala, ze sprawdzaniem błędów, na wątkach:

 

#include <SFML/Network.hpp>
#include <string>
#include <thread>
#include <chrono>
#include <iostream>

using namespace std::chrono_literals;

struct Dane {
	int x, y;
};

void sendThread()
{
	sf::TcpSocket socket;
	sf::Socket::Status status = socket.connect("127.0.0.1", 53000);

	if (status != sf::Socket::Done) {
		std::cout << "socket error" << std::endl;
		std::this_thread::sleep_for(500ms);
		return;
	}

	Dane dane = { 123, 456 };

	while(true) {
		if (socket.send(&dane, sizeof(dane)) != sf::Socket::Done) {
			std::cout << "send error" << std::endl;
			std::this_thread::sleep_for(500ms);
			return;
		}

		std::this_thread::sleep_for(50ms);
	}
}

void receiveThread()
{
	sf::TcpListener listener;

	if (listener.listen(53000) != sf::Socket::Done) {
		std::cout << "listen error" << std::endl;
		std::this_thread::sleep_for(500ms);
		return;
	}

	sf::TcpSocket socket;
	if (listener.accept(socket) != sf::Socket::Done) {
		std::cout << "accept error" << std::endl;
		std::this_thread::sleep_for(500ms);
		return;
	}

	while (true) {

		Dane dane;
		std::size_t received;

		if (socket.receive(&dane, sizeof(dane), received) != sf::Socket::Done) {
			std::cout << "receive error" << std::endl;
			std::this_thread::sleep_for(500ms);
			return;
		}

		std::cout << dane.x << " " << dane.y << std::endl;

		std::this_thread::sleep_for(50ms);
	}
}

int main()
{
	std::thread thread(sendThread);
	//std::thread thread(receiveThread);

	thread.join();
}

 

Podobne pytania

0 głosów
1 odpowiedź 755 wizyt
pytanie zadane 19 czerwca 2015 w C i C++ przez Lukasz Bywalec (2,320 p.)
0 głosów
2 odpowiedzi 711 wizyt
pytanie zadane 3 stycznia 2020 w Sieci komputerowe, internet przez zkkf56 Dyskutant (8,710 p.)
0 głosów
1 odpowiedź 883 wizyt
pytanie zadane 3 stycznia 2018 w Sieci komputerowe, internet przez Raba_Ababa Początkujący (390 p.)

93,718 zapytań

142,631 odpowiedzi

323,262 komentarzy

63,266 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...