• 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?

Object Storage Arubacloud
0 głosów
1,046 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 Ekspert (345,160 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ź 353 wizyt
pytanie zadane 19 czerwca 2015 w C i C++ przez Lukasz Bywalec (2,320 p.)
0 głosów
2 odpowiedzi 417 wizyt
pytanie zadane 3 stycznia 2020 w Sieci komputerowe, internet przez zkkf56 Dyskutant (8,710 p.)
0 głosów
1 odpowiedź 460 wizyt
pytanie zadane 3 stycznia 2018 w Sieci komputerowe, internet przez Raba_Ababa Początkujący (390 p.)

92,620 zapytań

141,474 odpowiedzi

319,815 komentarzy

62,004 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...