Сетевая игра крестики нолики. Запускается сервер, после к нему могут подключаться игроки через браузер.
Для запуска сервера ./run.sh address port (by default 127.0.0.1 7777), после сервер будет принимать соединения по адрессу address и порту port.
run.sh clean - удаляет собранный проект
Подключение игроков осуществляется через браузер введя в адрессную строку address:port.
В игре можно создавать поле разного размера и ждать подключения к тебе второго игрока или же выбрать из списка игрока с кем ты хочешь играть. Все игроки играют независимо друг от друга.
http://sorokin.github.io/cpp-year2013/task-course-work.html
В данном задании предлагается на выбор реализовать программу, использующую для работы с сетью BSD-сокеты и реализующую один из популярных интернет протоколов. Примеры допустимых программ:
- HTTP-proxy сервер.
- Рекурсивный wget
- Простенькое веб-приложение:
- Чат
- RSS-агрегатор
- Wiki
Допускается написание других программ, но это необходимо предварительно согласовать со мной.
Набор требований/нетребований к реализации:
- Асинхронное выгребание событий от сокетов: epoll[1] [2](Linux), I/O completion ports[3] (Windows), kqueue[4] (FreeBSD)
- Программа должна реагировать на посылаемые ей SIGINT, SIGTERM и gracefully выходить. Именно не киляться, а выходить. Под словом выходить понимается выходить из функции main.
- Нельзя использовать библиотеки для работы с сокетами, кроме BSD-sockets.
- Нельзя использовать библиотеки, реализующие интернет протоколы.
- Для вещей не связанных с сетью, сторонние библиотеки использовать можно.
Предполагается, что разрабатываемую программу условно можно разделить на 3 части:
- Некоторая обертка над сокетами/epoll'ом, которая реализует TCP и ничего не знает про протокол вышележащего уровня.
- Реализация соответствующего интернет протокола, например HTTP, использующая 1 и ничего не знающая про прикладную логику.
- Прикладная логика, использующая 2.
Утверждается, что если программу нельзя будет легко разделить на эти 3 части, то её код это жуткая лапша. Возможно для некоторых программ это не так, надо смотреть на конкретном примере. Но есть шанс, что это так. Поэтому вам предлагается сразу писать программу разделяя её на эти три части: две библиотеки и сама программа.
Интерфейс части 1 может быть произвольным, но вы можете черпать вдохновение глядя на существующие библиотеки, например QTcpServer[5], QTcpSocket[6]. Аналогично для части 2: QNetworkAccessManager[7].
<h3>Сроки</h3>
<li>Работающую часть <a href="#part_1">1</a> необходимо показать 27 ноября.</li>
<li>Работающую часть <a href="#part_2">2</a> необходимо показать 11 декабря.</li>
<li>Работающую программу необходимо показать на зачетной неделе.</li>
<h3>Ссылки</h3>
<ol>
<li id="cite_note_1"><b><a href="#cite_ref_1">^</a></b> <a href="http://linux.die.net/man/4/epoll">man 4 epoll</a></li>
<li id="cite_note_2"><b><a href="#cite_ref_2">^</a></b> <a href="http://linux.die.net/man/7/epoll">man 7 epoll</a></li>
<li id="cite_note_3"><b><a href="#cite_ref_3">^</a></b> <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx">I/O Completion Ports</a></li>
<li id="cite_note_4"><b><a href="#cite_ref_4">^</a></b> <a href="http://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2">man 2 kqueue</a></li>
<li id="cite_note_5"><b><a href="#cite_ref_5">^</a></b> <a href="http://qt-project.org/doc/qt-5/qtcpserver.html">QTcpServer Class</a></li>
<li id="cite_note_6"><b><a href="#cite_ref_6">^</a></b> <a href="http://qt-project.org/doc/qt-5/qtcpsocket.html">QTcpSocket Class</a></li>
<li id="cite_note_7"><b><a href="#cite_ref_7">^</a></b> <a href="http://qt-project.org/doc/qt-5/qnetworkaccessmanager.html">QNetworkAccessManager Class</a></li>
</ol>
<p>
</p></ul>