「🎉」 init: wtf
This commit is contained in:
42
subjects/mini_serv/subject.ru.txt
Normal file
42
subjects/mini_serv/subject.ru.txt
Normal file
@ -0,0 +1,42 @@
|
||||
Имя назначения : 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)
|
Reference in New Issue
Block a user