#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
участника.