mpcio.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "mpcio.hpp"
  2. // The port number for the P1 -> P0 connection
  3. static const unsigned short port_p1_p0 = 2115;
  4. // The port number for the P2 -> P0 connection
  5. static const unsigned short port_p2_p0 = 2116;
  6. // The port number for the P2 -> P1 connection
  7. static const unsigned short port_p2_p1 = 2117;
  8. void mpcio_setup_computational(unsigned player,
  9. boost::asio::io_context &io_context,
  10. const char *p0addr, // can be NULL when player=0
  11. tcp::socket &peersock, tcp::socket &serversock)
  12. {
  13. if (player == 0) {
  14. // Listen for connections from P1 and from P2
  15. tcp::acceptor acceptor_p1(io_context,
  16. tcp::endpoint(tcp::v4(), port_p1_p0));
  17. tcp::acceptor acceptor_p2(io_context,
  18. tcp::endpoint(tcp::v4(), port_p2_p0));
  19. peersock = acceptor_p1.accept();
  20. serversock = acceptor_p2.accept();
  21. } else if (player == 1) {
  22. // Listen for connections from P2, make a connection to P0
  23. tcp::acceptor acceptor_p2(io_context,
  24. tcp::endpoint(tcp::v4(), port_p2_p1));
  25. tcp::resolver resolver(io_context);
  26. boost::system::error_code err;
  27. while(1) {
  28. boost::asio::connect(peersock,
  29. resolver.resolve(p0addr, std::to_string(port_p1_p0)), err);
  30. if (!err) break;
  31. std::cerr << "Connection to p0 refused, will retry.\n";
  32. sleep(1);
  33. }
  34. serversock = acceptor_p2.accept();
  35. } else {
  36. std::cerr << "Invalid player number passed to mpcio_setup_computational\n";
  37. }
  38. }
  39. void mpcio_setup_server(boost::asio::io_context &io_context,
  40. const char *p0addr, const char *p1addr,
  41. tcp::socket &p0sock, tcp::socket &p1sock)
  42. {
  43. // Make connections to P0 and P1
  44. tcp::resolver resolver(io_context);
  45. boost::system::error_code err;
  46. while(1) {
  47. boost::asio::connect(p0sock,
  48. resolver.resolve(p0addr, std::to_string(port_p2_p0)), err);
  49. if (!err) break;
  50. std::cerr << "Connection to p0 refused, will retry.\n";
  51. sleep(1);
  52. }
  53. while(1) {
  54. boost::asio::connect(p1sock,
  55. resolver.resolve(p1addr, std::to_string(port_p2_p1)), err);
  56. if (!err) break;
  57. std::cerr << "Connection to p1 refused, will retry.\n";
  58. sleep(1);
  59. }
  60. }