Я думаю, вы в замешательстве. Обычно у вас должно быть 2 сокета: 1 для приема соединений (у вас уже есть) и 1 для обмена данными (возвращается как new_fd
от вызова к accept()
в WinSocket:akzeptieren()
).
В большинстве фреймворков проводится большое различие между сокетами слушателя и потоковыми сокетами:
// oversimplified interface.
class Listener
{
public:
Listener ( const std::string& host, const unsigned short port );
Stream * accept ();
};
// oversimplified interface.
class Stream
{
public:
const std::string peer () const;
size_t send ( const void * data, size_t size );
size_t recv ( void * data, size_t size );
};
Итак, ваш код должен выглядеть так:
const std::string host = "127.0.0.1";
const unsigned short port = 1234;
Listener listener(host, port);
while ((stream = listener.accept())
{
std::cout
<< "Connection from '" << stream->peer() << "'."
<< std::endl;
stream->send("Hello, world!", 13);
delete stream; // close and shutdown.
}
Тогда вы можете иметь:
class WinListener;
class WinStream;
И сделать все это многопоточным.
Примечание : это требование (задание?), Поэтому я не предлагаю вам поступить иначе. Однако в реальной производственной системе это не очень хороший дизайн сервера. Возможно, вы захотите прочитать о подсистемах порт завершения ввода / вывода , epoll и kqueue для эффективной асинхронной операции ввода-вывода.