Создание экземпляра сокета (это плохая практика или нет ?)

#c #sockets #asio

Вопрос:

Мне нужно создать архитектуру сервер-клиент для университетского проекта, и я застрял на части сокетов. Я думал, что могу создать экземпляр всего сервера один раз, а затем вызывать сокет всякий раз, когда это необходимо, но, если я сделаю это, всякий раз, когда я запускаю сервер, на стороне клиента ничего не произойдет, если я не укажу, чтобы он что — то написал в момент создания экземпляра.

Код для созданного сокета:

 #include lt;asio.hppgt; #include lt;iostreamgt;  using asio::ip::tcp;  class ServerSocket { public:  ServerSocket(ServerSocketamp; otherSingleton) = delete;  void operator=(const ServerSocketamp; copySingleton) = delete;   static tcp::socket* GetInstance();  private:  static ServerSocket* instance;  tcp::socket* socket;   ServerSocket()  {  std::cout lt;lt; "Server started";  try  {  asio::io_context io_context;   tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 13));   for (;;)  {  tcp::socket socket(io_context);  acceptor.accept(socket);  }  }  catch (std::exceptionamp; e)  {  std::cerr lt;lt; e.what() lt;lt; std::endl;  }  }   ~ServerSocket()  {  std::cout lt;lt; "Server closed";  } };  

и его cpp

 ServerSocket* ServerSocket::instance(nullptr);  tcp::socket* ServerSocket::GetInstance() {  if (instance == nullptr)  {  instance = new ServerSocket();  }  return instance-gt;socket; }  

Я думал, что на самом деле мне нужно создать экземпляр акцептора и указать сокет в моей функции, например:

 void DBUser::SendUser() {  ServerSocket* instance;   tcp::socket* socket = instance-gt;GetInstance();  try  {  //instead of trying to write directly in the function i should call the acceptor again   //and create a socket on the spot  asio::error_code ignored_error;  asio::write(*socket, asio::buffer(m_user), ignored_error);  }  catch (std::exceptionamp; e)  {  std::cerr lt;lt; e.what() lt;lt; std::endl;  } }  

если кто-нибудь может помочь мне понять, что я делаю не так и как я могу это исправить, я был бы признателен

Комментарии:

1. Вы принимаете новое соединение в локальный объект сокета, а затем немедленно закрываете его (как только оно выходит за рамки). Я бы рекомендовал вам внимательно прочитать примеры asio.

2. Кроме того, обратите внимание, что вы никогда не инициализируете ServerSocket::socket участника.