Comments 24
Ок, а при чём тут C# из заголовка?
Публичное поле port в класса сервера — фу-фу-фу.
Обработка подключений в один поток.
Это что? Студенческая лабораторная?
Не в обиду автору, но за старания 5, за реализацию 2. Даже для начала обучения, возьмите за основу готовые красивые и практичные библиотеки. Хотя бы то-же Boost::Asio. Даже базовых примеров хватит с лихвой, чтобы начать делать что-то, что будет уже работать чуть стабильнее и адекватнее, чем вышеизложенное.
Мне с вами сложно согласиться, что boost::asio подходит для новичка. Когда только начинал знакомиться с сокетами в C++, конечно, гуглил библиотеки и буст рассматривал. Но у меня была простая задача: передать файл по сети, т.е. простая утилита по типу netcat, и я совсем не понимал, зачем буст предлагает мне какие-то io-сервисы и acceptor-ы.
В итоге накопал в интернете примеры работы с сокетами с помощью API ОС и сделал свою небольшую обертку над ним (кому интересно, репозиторий у меня на гитхабе — cppstreams). Файлы хотелось передавать между виндой и линуксом своим приложением, поэтому сделал ее кроссплатформенной, научил ее работать с C++-овым stream-ом и только после этого уже понял, для чего нужны io-сервисы, select-ы и как это вообще работает.
Но вот так с наскоку разобраться в boost::asio у меня не вышло.
Если цель — поучиться, покопавшись в исходниках библиотеки, то я бы предложил посмотреть еще Poco — вполне работоспособно, но внутренняя реализация читается легче, чем boost
Ну дык, лабы/курсовые/дипломы сделали, а потом смотрят и думают — чё ж добру пропадать, может ещё куда залить :)

/me нервно посматривает на свою лабу по мультипоточности в JS
Да там ничего такого что потянет на пост. Заюзал вот эту библиотеку, и посчитал числовой ряд в несколько потоков. Это вроде как неполная реализация MPI протокола для ноды
Если чуток подробнее про htons(), то она нужна для смены (при необходимости) порядка байтов в словах (big/little-endian), на разных архитектурах он может отличаться, а в сети используется big-endian.
server.port = 3487;//порт это ushort — так что cin.get() и т.п. функции тут работаю некорректно. Лучше задать фвручную

Чем вас не устроил стандартный способ?


std::cin << server.port;

А про остальной код можно промолчать. Смешение стримов и сишных обёрток для stdio уже говорит о многом. Зря сюда его выложили, для новичков он не годится, а для ветеранов только на потеху

Будет так же и UDP версия, но отличия
скорее всего до вас не дойдут. (с) анекдот
Я бы промолчал…
но вот за такое:
А файлик, который вы так часто видели includes.h. Вот и он:

using namespace std;
нужно линейкой по пальцам бить, до осознания…
Бесконечный цикл в конструкторе — это круто. Типа — наш сервер никто не остановит!
Второй раз приконнектиться тоже никто не сможет. Да и сокет вроде блокирующий, так что отправить меньше 1024 байт также будет нельзя.
А мне вот тоже интересно, как написать простой работающий сервер на C++ (без boost, а то я смотрел уже примеры на нём, как-то не очень понятно выглядит). Можно без многопоточности, требования по нагрузке — до 15-20 одновременных клиентов (для небольшого делового чата, например). И желательно с использованием неблокирующих сокетов. Кто-нибудь запилит такую статью? Было бы круто.
Серьёзно? Без многопоточности на пару клиентов — это задача лабораторной работы среднего ВУЗа. Почему лабораторной? Потому-что во взрослой жизни такое приложение неработоспособно. Добавляем многопоточность (или асинхронность) — получаем лабораторную работу хорошего ВУЗа. В сети реализаций полно, в гугл вроде пока пускают бесплатно.
Сервер на 15-20 клиентов с использованием С++ — это из пушки по воробьям. На такую «нагрузку» можно на чём угодно левой пяткой написать сервер, и будет хорошо работать, и поддерживать будет легче. Взять тот же nodejs.
Я писал небольшие сервера на Java. Насколько я помню, у меня так и не получилось принять новое соединение до завершения обработки уже поступившего (то есть если нужен LongPoll — беда). Возможно, я что-то делал не так, либо у Java проблема с неблокирующими сокетами.
А если надо будет 100 или 200? Или 500? Мне кажется, если есть хоть какой-то шанс, что понадобится масштабируемость — лучше сразу писать не левой пяткой, а как следует.
1. Код в статье не намного отличается от docs.microsoft.com/ru-ru/windows/desktop/WinSock/complete-server-code — думаю для начального уровня и обучения — вполне нормально.
2. А при использовании Boost::Asio — не нужно забывать про то что указано в www.boost.org/LICENSE_1_0.txt — "....this restriction and the following disclaimer, must be included in all copies of the Software....."
Only those users with full accounts are able to leave comments. Log in, please.