42 lines
4.7 KiB
Plaintext
42 lines
4.7 KiB
Plaintext
Имя назначения : mini_serv
|
||
Ожидаемые файлы : mini_serv.c
|
||
Разрешенные функции : write, close, select, socket, accept, listen, send, recv, bind, strstr, malloc, realloc, free, calloc, bzero, atoi, sprintf, strlen, exit, strcpy, strcat, memset
|
||
--------------------------------------------------------------------------------
|
||
|
||
Напишите программу, которая будет прослушивать подключение клиента к определенному порту на 127.0.0.1 и позволит клиентам разговаривать друг с другом
|
||
|
||
Эта программа будет принимать в качестве первого аргумента порт для привязки
|
||
Если аргумент не задан, он должен написать в stderr "Wrong number of arguments", за которым следует a \n и выйти со статусом 1
|
||
Если системный вызов возвращает ошибку до того, как программа начнет принимать соединение, она должна написать в stderr "Fatal error", а затем a \n и выйти со статусом 1
|
||
Если вы не можете выделить память, он должен написать в stderr "Fatal error", а затем a \n и выйти со статусом 1
|
||
|
||
Ваша программа должна быть неблокирующей, но клиент может быть ленивым, и если он не читает ваше сообщение, вы не должны отключать его...
|
||
|
||
Ваша программа не должна содержать #define preproc
|
||
Ваша программа должна слушать только 127.0.0.1
|
||
Fd, который вы получите, уже будет настроен на блокировку 'recv' или 'send', если select не был вызван до их вызова, но в противном случае не будет заблокирован.
|
||
|
||
Когда клиент подключается к серверу:
|
||
- клиенту будет выдано удостоверение личности. первый клиент получит идентификатор 0, а каждый новый клиент получит последний идентификатор клиента + 1
|
||
- %d будет заменено на это число
|
||
- всем клиентам, которые были подключены к серверу, отправляется сообщение: "server: client %d just arrived\n"
|
||
|
||
клиенты должны иметь возможность отправлять сообщения в вашу программу.
|
||
- сообщение будет состоять только из печатаемых символов, проверять его не нужно
|
||
- одно сообщение может содержать несколько \n
|
||
- когда сервер получает сообщение, он должен повторно отправить его всем другим клиентам с "client %d:" перед каждой строкой!
|
||
|
||
Когда клиент отключается от сервера:
|
||
- всем клиентам, которые были подключены к серверу, отправляется сообщение: "server: client %d just left\n"
|
||
|
||
Утечки памяти или fd запрещены
|
||
|
||
Чтобы помочь вам, вы найдете файл main.c с началом работы сервера и, возможно, некоторые полезные функции. (Остерегайтесь, чтобы этот файл использовал запрещенные функции или писал вещи, которых не должно быть в вашей окончательной программе)
|
||
|
||
Предупреждение наш тестер ожидает, что вы будете отправлять сообщения так быстро, как только сможете. Не делайте ненужного буфера.
|
||
|
||
Оценка может быть немного дольше, чем обычно...
|
||
|
||
Подсказка: вы можете использовать nc для тестирования вашей программы
|
||
Подсказка: вы должны использовать nc для тестирования вашей программы
|
||
Подсказка: Для тестирования вы можете использовать fcntl(fd, F_SETFL, O_NONBLOCK), но используйте select и НИКОГДА НЕ проверяйте EAGAIN (man 2 send) |