mpcio.cpp 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. int num_threads,
  12. std::deque<tcp::socket> &peersocks, tcp::socket &serversock)
  13. {
  14. if (player == 0) {
  15. // Listen for connections from P1 and from P2
  16. tcp::acceptor acceptor_p1(io_context,
  17. tcp::endpoint(tcp::v4(), port_p1_p0));
  18. tcp::acceptor acceptor_p2(io_context,
  19. tcp::endpoint(tcp::v4(), port_p2_p0));
  20. for (int i=0;i<num_threads;++i) {
  21. peersocks.emplace_back(io_context);
  22. }
  23. for (int i=0;i<num_threads;++i) {
  24. tcp::socket peersock = acceptor_p1.accept();
  25. // Read 2 bytes from the socket, which will be the thread
  26. // number
  27. unsigned short thread_num;
  28. boost::asio::read(peersock,
  29. boost::asio::buffer(&thread_num, sizeof(thread_num)));
  30. if (thread_num >= num_threads) {
  31. std::cerr << "Received bad thread number from peer\n";
  32. } else {
  33. peersocks[thread_num] = std::move(peersock);
  34. }
  35. }
  36. serversock = acceptor_p2.accept();
  37. } else if (player == 1) {
  38. // Listen for connections from P2, make num_threads connections to P0
  39. tcp::acceptor acceptor_p2(io_context,
  40. tcp::endpoint(tcp::v4(), port_p2_p1));
  41. tcp::resolver resolver(io_context);
  42. boost::system::error_code err;
  43. peersocks.clear();
  44. for (unsigned short thread_num = 0; thread_num < num_threads; ++thread_num) {
  45. tcp::socket peersock(io_context);
  46. while(1) {
  47. boost::asio::connect(peersock,
  48. resolver.resolve(p0addr, std::to_string(port_p1_p0)), err);
  49. if (!err) break;
  50. std::cerr << "Connection to p0 refused, will retry.\n";
  51. sleep(1);
  52. }
  53. // Write 2 bytes to the socket indicating which thread
  54. // number this socket is for
  55. boost::asio::write(peersock,
  56. boost::asio::buffer(&thread_num, sizeof(thread_num)));
  57. peersocks.push_back(std::move(peersock));
  58. }
  59. serversock = acceptor_p2.accept();
  60. } else {
  61. std::cerr << "Invalid player number passed to mpcio_setup_computational\n";
  62. }
  63. }
  64. void mpcio_setup_server(boost::asio::io_context &io_context,
  65. const char *p0addr, const char *p1addr,
  66. tcp::socket &p0sock, tcp::socket &p1sock)
  67. {
  68. // Make connections to P0 and P1
  69. tcp::resolver resolver(io_context);
  70. boost::system::error_code err;
  71. while(1) {
  72. boost::asio::connect(p0sock,
  73. resolver.resolve(p0addr, std::to_string(port_p2_p0)), err);
  74. if (!err) break;
  75. std::cerr << "Connection to p0 refused, will retry.\n";
  76. sleep(1);
  77. }
  78. while(1) {
  79. boost::asio::connect(p1sock,
  80. resolver.resolve(p1addr, std::to_string(port_p2_p1)), err);
  81. if (!err) break;
  82. std::cerr << "Connection to p1 refused, will retry.\n";
  83. sleep(1);
  84. }
  85. }