Advertisement
Guest User

Untitled

a guest
Jan 21st, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.32 KB | None | 0 0
  1. // Networking_Test_1.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h" //what is this garbage
  5.  
  6. #include <SFML/Graphics.hpp>
  7. #include <SFML/Audio.hpp>
  8. #include <SFML/Network.hpp>
  9. #include <iostream>
  10. #include <string>
  11.  
  12. #include <vector>
  13. #include <limits>
  14. #include <fstream>
  15. #include <sstream>
  16. #include <math.h>
  17. #include <list>
  18. #include <algorithm>
  19. #include <iterator>
  20. #include <deque>
  21. #include <unordered_map>
  22.  
  23. class Packet_Component {
  24. protected:
  25.  
  26. public:
  27. virtual void packet_write(sf::Packet &packet) = 0;
  28. virtual bool packet_read(sf::Packet &packet) = 0;
  29.  
  30. template <typename T>
  31. void vec_write_component(sf::Packet &packet, std::vector <T> &read_from) {
  32. packet << static_cast<sf::Uint16>(read_from.size());
  33. for (auto i = read_from.begin(); i != read_from.end(); i++) {
  34. (*i).packet_write(packet);
  35. }
  36. }
  37.  
  38. template <typename T>
  39. bool vec_read_component(sf::Packet &packet, std::vector <T> &write_to) {
  40. sf::Uint16 vec_size;
  41. if (! (packet >> vec_size)) {
  42. return false;
  43. }
  44.  
  45. write_to.resize(vec_size);
  46.  
  47. for (auto i = write_to.begin(); i != write_to.end(); i++) {
  48. if (! (*i).packet_read(packet)) {
  49. return false;
  50. }
  51. }
  52.  
  53. return true;
  54. }
  55.  
  56. /*void vec_write_component(sf::Packet &packet, std::vector <Packet_Component> &read_from) {
  57. packet << static_cast<sf::Uint16>(read_from.size());
  58. for (auto i = read_from.begin(); i != read_from.end(); i++) {
  59. (*i).packet_write(packet);
  60. }
  61. }
  62. bool vec_read_component(sf::Packet &packet, std::vector <Packet_Component> &write_to) {
  63. sf::Uint16 vec_size;
  64. if (! (packet >> vec_size)) {
  65. return false;
  66. }
  67.  
  68. write_to.resize(vec_size);
  69.  
  70. for (auto i = write_to.begin(); i != write_to.end(); i++) {
  71. if ( ! (*i).packet_read(packet)) {
  72. return false;
  73. }
  74. }
  75. }*/
  76.  
  77. Packet_Component() {}
  78. virtual ~Packet_Component() {}
  79. };
  80.  
  81. class Test : public Packet_Component {
  82. //friend sf::Packet& operator >>(sf::Packet& packet, Test& data);
  83. //friend sf::Packet& operator <<(sf::Packet& packet, Test& data);
  84. protected:
  85. sf::Uint64 _value;
  86. public:
  87. sf::Uint64 value() { return _value; }
  88. void clear() { _value = 0; }
  89. virtual void packet_write(sf::Packet &packet);
  90. virtual bool packet_read(sf::Packet &packet);
  91. Test() : _value(0) {}
  92. Test(sf::Uint64 value) : _value(value) {}
  93. };
  94. void Test::packet_write(sf::Packet &packet) {
  95. packet << _value;
  96. }
  97. bool Test::packet_read(sf::Packet &packet) {
  98. if (! (packet >> _value) ) {
  99. return false;
  100. }
  101. return true;
  102. }
  103.  
  104. class Bun : public Packet_Component {
  105. protected:
  106. sf::String _value;
  107. public:
  108. sf::String value() { return _value; }
  109. void report() { std::cout << _value.toAnsiString() << "\n"; }
  110.  
  111. virtual void packet_write(sf::Packet &packet);
  112. virtual bool packet_read(sf::Packet &packet);
  113. Bun() : _value("Plain") {}
  114. Bun(sf::String value) : _value(value) {}
  115. };
  116. void Bun::packet_write(sf::Packet &packet) {
  117. packet << _value;
  118. }
  119. bool Bun::packet_read(sf::Packet &packet) {
  120. if (! (packet >> _value)) {
  121. return false;
  122. }
  123. return true;
  124. }
  125.  
  126. class Patty : public Packet_Component {
  127. protected:
  128. sf::String _value;
  129. public:
  130. sf::String value() { return _value; }
  131. void report() { std::cout << _value.toAnsiString() << "\n"; }
  132.  
  133. virtual void packet_write(sf::Packet &packet);
  134. virtual bool packet_read(sf::Packet &packet);
  135. Patty() : _value("Beef") {}
  136. Patty(sf::String value) : _value(value) {}
  137. };
  138. void Patty::packet_write(sf::Packet &packet) {
  139. packet << _value;
  140. }
  141. bool Patty::packet_read(sf::Packet &packet) {
  142. if (! (packet >> _value)) {
  143. return false;
  144. }
  145. return true;
  146. }
  147.  
  148. class Meat : public Packet_Component {
  149. protected:
  150. std::vector <Patty> _patties;
  151. public:
  152. void patties(std::vector<Patty> &addTo) { addTo = _patties; }
  153. void report() {
  154. for (auto i = _patties.begin(); i != _patties.end(); i++) {
  155. (*i).report();
  156. }
  157. }
  158.  
  159. virtual void packet_write(sf::Packet &packet);
  160. virtual bool packet_read(sf::Packet &packet);
  161. Meat() : _patties({ Patty() }) {}
  162. Meat(std::vector <Patty> &patties) : _patties(patties) {}
  163. };
  164. void Meat::packet_write(sf::Packet &packet) {
  165. vec_write_component(packet, _patties);
  166. }
  167. bool Meat::packet_read(sf::Packet &packet) {
  168. return vec_read_component(packet, _patties);
  169. }
  170.  
  171. class Veggie : public Packet_Component {
  172. protected:
  173. sf::Uint64 _number;
  174. sf::String _type;
  175. public:
  176. sf::Uint64 number() { return _number; }
  177. sf::String type() { return _type; }
  178. void report() { std::cout << _type.toAnsiString() << " x " << _number << "\n"; }
  179.  
  180. virtual void packet_write(sf::Packet &packet);
  181. virtual bool packet_read(sf::Packet &packet);
  182. Veggie() : _number(0), _type("") {}
  183. Veggie(sf::Uint64 number, sf::String type) : _number(number), _type(type) {}
  184. };
  185. void Veggie::packet_write(sf::Packet &packet) {
  186. packet << _number << _type;
  187. }
  188. bool Veggie::packet_read(sf::Packet &packet) {
  189. if (! (packet >> _number >> _type)) {
  190. return false;
  191. }
  192. return true;
  193. }
  194.  
  195. class Vegetables : public Packet_Component {
  196. protected:
  197. std::vector <Veggie> _veggies;
  198. public:
  199. void veggies(std::vector<Veggie> &addTo) { addTo = _veggies; }
  200. void report() {
  201. for (auto i = _veggies.begin(); i != _veggies.end(); i++) {
  202. (*i).report();
  203. }
  204. }
  205.  
  206. virtual void packet_write(sf::Packet &packet);
  207. virtual bool packet_read(sf::Packet &packet);
  208. Vegetables() {}
  209. Vegetables(std::vector <Veggie> &veggies) : _veggies(veggies) {}
  210. };
  211. void Vegetables::packet_write(sf::Packet &packet) {
  212. vec_write_component(packet, _veggies);
  213. }
  214. bool Vegetables::packet_read(sf::Packet &packet) {
  215. return vec_read_component(packet, _veggies);
  216. }
  217.  
  218. class Condiment : public Packet_Component {
  219. protected:
  220. sf::Int64 _position;
  221. float _coverage;
  222. sf::String _type;
  223. public:
  224. sf::Int64 position() { return _position; }
  225. float coverage() { return _coverage; }
  226. sf::String type() { return _type; }
  227. void report() { std::cout << _type.toAnsiString() << " on Layer# " << _position << " over " << _coverage << "% \n"; }
  228.  
  229. virtual void packet_write(sf::Packet &packet);
  230. virtual bool packet_read(sf::Packet &packet);
  231. Condiment() : _position(0), _coverage(0.0), _type("") {}
  232. Condiment(sf::Int64 position, float coverage, sf::String type) : _position(position), _coverage(coverage), _type(type) {}
  233. };
  234. void Condiment::packet_write(sf::Packet &packet) {
  235. packet << _position << _coverage << _type;
  236. }
  237. bool Condiment::packet_read(sf::Packet &packet) {
  238. if (! (packet >> _position >> _coverage >> _type)) {
  239. return false;
  240. }
  241. return true;
  242. }
  243.  
  244. class Condiments : public Packet_Component {
  245. protected:
  246. std::vector <Condiment> _condiments;
  247. public:
  248. void condiments(std::vector<Condiment> &addTo) { addTo = _condiments; }
  249. void report() {
  250. for (auto i = _condiments.begin(); i != _condiments.end(); i++) {
  251. (*i).report();
  252. }
  253. }
  254.  
  255. virtual void packet_write(sf::Packet &packet);
  256. virtual bool packet_read(sf::Packet &packet);
  257. Condiments() {}
  258. Condiments(std::vector <Condiment> &condiments) : _condiments(condiments) {}
  259. };
  260. void Condiments::packet_write(sf::Packet &packet) {
  261. vec_write_component(packet, _condiments);
  262. }
  263. bool Condiments::packet_read(sf::Packet &packet) {
  264. return vec_read_component(packet, _condiments);
  265. }
  266.  
  267. class Toppings : public Packet_Component {
  268. public:
  269. Bun _bun;
  270. Meat _meat;
  271. Vegetables _vegetables;
  272. Condiments _condiments;
  273.  
  274. void report() {
  275. _bun.report();
  276. _meat.report();
  277. _vegetables.report();
  278. _condiments.report();
  279. }
  280.  
  281. virtual void packet_write(sf::Packet &packet);
  282. virtual bool packet_read(sf::Packet &packet);
  283. Toppings() {}
  284. Toppings(Bun &bun, Meat &meat, Vegetables &vegetables, Condiments &condiments) : _bun(bun), _meat(meat), _vegetables(vegetables), _condiments(condiments) {}
  285. virtual ~Toppings() {}
  286. };
  287. void Toppings::packet_write(sf::Packet &packet) {
  288. _bun.packet_write(packet);
  289. _meat.packet_write(packet);
  290. _vegetables.packet_write(packet);
  291. _condiments.packet_write(packet);
  292. }
  293. bool Toppings::packet_read(sf::Packet &packet) {
  294. if (! _bun.packet_read(packet)) {
  295. return false;
  296. }
  297. if (! _meat.packet_read(packet)) {
  298. return false;
  299. }
  300. if (! _vegetables.packet_read(packet)) {
  301. return false;
  302. }
  303. if (! _condiments.packet_read(packet)) {
  304. return false;
  305. }
  306. return true;
  307. }
  308.  
  309. class Burger : public Packet_Component {
  310. protected:
  311.  
  312. public:
  313. Toppings _toppings;
  314.  
  315. void report() {
  316. _toppings.report();
  317. }
  318.  
  319. virtual void packet_write(sf::Packet &packet);
  320. virtual bool packet_read(sf::Packet &packet);
  321. Burger() {}
  322. Burger(Toppings &toppings) : _toppings(toppings) {}
  323. virtual ~Burger() {}
  324. };
  325. void Burger::packet_write(sf::Packet &packet) {
  326. _toppings.packet_write(packet);
  327. }
  328. bool Burger::packet_read(sf::Packet &packet) {
  329. return _toppings.packet_read(packet);
  330. }
  331.  
  332. /*class Garbage : public Packet_Component {
  333. public:
  334. std::vector <int> _values;
  335. virtual void packet_write(sf::Packet &packet) {}
  336. virtual bool packet_read(sf::Packet &packet) {}
  337. void test() {
  338. sf::Packet packet;
  339. vec_write_component(packet, _values);
  340. }
  341. Garbage() : _values({ 1,2,3,4,5 }) {}
  342. };*/
  343.  
  344. /*
  345. sf::Packet& operator <<(sf::Packet& packet, Test& data)
  346. {
  347. return packet << data._value;
  348. }
  349.  
  350. sf::Packet& operator >>(sf::Packet& packet, Test& data)
  351. {
  352. return packet >> data._value;
  353. }
  354. */
  355.  
  356. class Client {
  357. protected:
  358. sf::TcpSocket _socket;
  359. public:
  360. sf::TcpSocket &socket() { return _socket; }
  361. bool connect(sf::IpAddress server_address, unsigned short server_port);
  362. bool send_to_server(sf::Packet &packet);
  363. bool receive_from_server();
  364.  
  365. void update();
  366.  
  367. Client();
  368. Client(const Client &copy) {}
  369. };
  370. Client::Client() {
  371.  
  372. }
  373. bool Client::connect(sf::IpAddress server_address, unsigned short server_port) {
  374. if (_socket.connect(server_address, server_port) != sf::Socket::Done)
  375. {
  376. return false;
  377. }
  378.  
  379. return true;
  380. }
  381. bool Client::send_to_server(sf::Packet &packet) {
  382. if (_socket.send(packet) != sf::Socket::Done) {
  383. return false;
  384. }
  385. return true;
  386. }
  387. bool Client::receive_from_server() {
  388. sf::Packet temp;
  389. if (_socket.receive(temp) == sf::Socket::Done) {
  390. //PUSH INTO GAME STATE
  391.  
  392. return true;
  393. }
  394. return false;
  395. }
  396. void Client::update() {
  397. sf::Packet temp;
  398. receive_from_server();
  399. }
  400.  
  401. class Server {
  402. protected:
  403. const unsigned short _port_listener_default;
  404. const unsigned short _port_limit;
  405.  
  406. bool _listening_for_connections;
  407.  
  408. sf::IpAddress _address;
  409. unsigned short _port_listener;
  410. sf::TcpListener _listener;
  411. std::vector <Client> _clients;
  412. public:
  413. sf::IpAddress address() { return _address; }
  414. unsigned short port_listener() { return _port_listener; }
  415.  
  416. bool initialize();
  417. void accept_connections();
  418. void finalize_connections();
  419.  
  420. bool distribute(sf::Packet &packet);
  421. bool receive_and_distribute();
  422.  
  423. void update();
  424.  
  425. Server();
  426. virtual ~Server() {}
  427. };
  428. Server::Server() :
  429. _port_listener_default(54000),_port_limit(55000), _listening_for_connections(false)
  430. {
  431. //LISTENER DOES NOT STOP PROGRAM FROM RUNNING, RETURNS 0 UNLESS IT FINDS A CONNECTION WAITING
  432. _listener.setBlocking(false);
  433. //START WITH ONE EMPTY CLIENT TO CONNECT
  434. _clients.resize(1);
  435. }
  436. bool Server::initialize() {
  437. //_address = sf::IpAddress::getPublicAddress();
  438. //TEMP
  439. _address = sf::IpAddress::getLocalAddress();
  440.  
  441. if (_address == sf::IpAddress::None) {
  442. return false;
  443. }
  444.  
  445. _port_listener = _port_listener_default;
  446. while ((_listener.listen(_port_listener) != sf::Socket::Done)) {
  447. _port_listener++;
  448. if (_port_listener > _port_limit) {
  449. return false;
  450. }
  451. }
  452.  
  453. //FLAG SO THAT UPDATE WILL KNOW TO CHECK FOR NEW CONNECTIONS
  454. _listening_for_connections = true;
  455.  
  456. return true;
  457. }
  458. void Server::accept_connections() {
  459. if (_listener.accept(_clients.back().socket()) == sf::Socket::Done) {
  460. //ADD ANOTHER EMPTY CLIENT AT THE END TO FILL
  461. _clients.resize(_clients.size() + 1);
  462. }
  463. }
  464. void Server::finalize_connections() {
  465. _listening_for_connections = false;
  466. //TRIM THE LAST EMPTY CLIENT
  467. _clients.pop_back();
  468. }
  469. bool Server::distribute(sf::Packet &packet) {
  470. for(auto i = _clients.begin(); i != _clients.end(); i++) {
  471. //SEND ON EACH CLIENT SOCKET (DISTINCT FROM THE METHOD BY WHICH A CLIENT SENDS OR RECEIVES TO/FROM SERVER
  472. if ((*i).socket().send(packet) != sf::Socket::Done) {
  473. return false;
  474. }
  475. }
  476. //THEN PUSH TO OWN GAME STATE
  477.  
  478. return true;
  479. }
  480. bool Server::receive_and_distribute() {
  481. sf::Packet temp;
  482. bool found = false;
  483. for (auto i = _clients.begin(); i != _clients.end(); i++) {
  484. //RECEIVER ALONG EACH CLIENT'S SOCKET UNTIL A PACKET IS FOUND
  485. //DISTINCT FROM THE CLIENT METHODS TO SEND/RECEIVE TO/FROM SERVER
  486. if ((*i).socket().receive(temp) == sf::Socket::Done) {
  487. found = true;
  488. break;
  489. }
  490. }
  491.  
  492. if (found) {
  493. //SEND TO ALL CLIENTS
  494. distribute(temp);
  495. //THEN PUSH TO OWN GAME STATE
  496.  
  497. //TEMP
  498. Burger burger_receiver;
  499. burger_receiver.packet_read(temp);
  500. burger_receiver.report();
  501. }
  502.  
  503. return true;
  504. }
  505. void Server::update() {
  506. if (_listening_for_connections) {
  507. accept_connections();
  508. }
  509.  
  510. receive_and_distribute();
  511. }
  512.  
  513. class Connection {
  514. protected:
  515. //FLAGS WHETHER THIS COMPUTER IS HOSTING THE GAME
  516. bool _hosting;
  517.  
  518. public:
  519. Server server_self;
  520. Client client_self;
  521.  
  522. bool connect_as_client(sf::IpAddress server_address, unsigned short server_port);
  523. bool connect_as_server();
  524. void packet_distribute(sf::Packet &packet);
  525.  
  526. void start_game();
  527.  
  528. void update();
  529.  
  530. Connection();
  531. };
  532. Connection::Connection() :
  533. _hosting(false)
  534. {
  535.  
  536. }
  537. bool Connection::connect_as_client(sf::IpAddress server_address, unsigned short server_port) {
  538. return client_self.connect(server_address, server_port);
  539. }
  540. bool Connection::connect_as_server() {
  541. if (! server_self.initialize()) {
  542. return false;
  543. }
  544.  
  545. _hosting = true;
  546. return true;
  547. }
  548. void Connection::packet_distribute(sf::Packet &packet) {
  549. if (_hosting) {
  550. server_self.distribute(packet);
  551. //SEND PACKET TO ALL OTHER CLIENTS THEN TO CLIENT_SELF
  552. }
  553. else {
  554. client_self.send_to_server(packet);
  555. //SEND PACKET TO HOST, WAIT TO RECEIVE IT BACK
  556. }
  557. }
  558. void Connection::start_game() {
  559. if (_hosting) {
  560. //SERVER: TRIM EMPTY CONNECTION FROM SERVER AND STOP UPDATE FROM FINDING NEW CONNECTIONS
  561. server_self.finalize_connections();
  562. }
  563. }
  564. void Connection::update() {
  565. if (_hosting) {
  566. server_self.update();
  567. }
  568. else {
  569. client_self.update();
  570. }
  571. }
  572.  
  573. int main()
  574. {
  575.  
  576. //Garbage garbage;
  577. //garbage.test();
  578.  
  579. std::cout << "Started." << std::endl;
  580.  
  581. Connection _connection_server;
  582. Connection _connection_client;
  583.  
  584. if (! _connection_server.connect_as_server()) {
  585. std::cout << "Error\n";
  586. }
  587. _connection_client.connect_as_client(_connection_server.server_self.address(), _connection_server.server_self.port_listener());
  588.  
  589. _connection_server.update();
  590.  
  591. _connection_server.start_game();
  592.  
  593. Burger burger_sender(Toppings(Bun("Sesame"), Meat(std::vector<Patty>({ Patty("Beef"), Patty("Chicken") })), Vegetables(std::vector<Veggie>({ Veggie(6, "Pickles"),Veggie(20, "Lettuce"),Veggie(1, "Tomato") })), Condiments(std::vector<Condiment>({ Condiment(-1,0.33,"Mustard"), Condiment(2,0.66,"Ketchup") }))));
  594. burger_sender.report();
  595.  
  596. sf::Packet packet_sender;
  597.  
  598. burger_sender.packet_write(packet_sender);
  599.  
  600. _connection_client.packet_distribute(packet_sender);
  601. _connection_server.update();
  602. _connection_server.update();
  603. _connection_server.update();
  604.  
  605. /*Burger burger_receiver;
  606. burger_receiver.packet_read(packet_receiver);
  607.  
  608. std::cout << "\n\nReceived::\n";
  609. burger_receiver.report();*/
  610.  
  611. std::cout << "Finished." << std::endl;
  612.  
  613. system("pause");
  614.  
  615. return 0;
  616. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement