C C  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Сокеты и сетевой ввод-вывод

Тест проверяет TCP-сокеты как потоковый и ресурсно ограниченный интерфейс: жизненный цикл дескриптора, сетевые адреса, частичный ввод-вывод, завершение, диагностику и защиту протокола от недоверенных длин и медленных клиентов.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 6 темам.
Вопрос 1 из 30
Какой сокет возвращает accept?
CC17
int client=accept(server,(struct sockaddr*)&addr,&len);
Вопрос 2 из 30
Что неверно в проверке socket?
CC17
int fd=socket(AF_INET,SOCK_STREAM,0);
if(fd<=0) fail();
Вопрос 3 из 30
Какой порядок серверных вызовов типичен для TCP?
Вопрос 4 из 30
Что должен сделать сервер, если `bind` вернул `-1`?
CC17
if(bind(fd,(struct sockaddr*)&sa,sizeof sa)==-1){
  int e=errno; close(fd); return e;
}
Вопрос 5 из 30
Почему слушающий сокет нельзя считать соединением с первым клиентом?
CC17
int server=socket(...);
listen(server,128);
int client=accept(server,NULL,NULL);
Вопрос 6 из 30
Зачем использовать htons для номера порта?
CC17
addr.sin_port=htons(8080);
Вопрос 7 из 30
Почему приведение `(struct sockaddr *)&addr` обычно допустимо при вызове `bind`?
Вопрос 8 из 30
Какой подход лучше для клиента, поддерживающего IPv4 и IPv6?
CC17
int connect_host(const char *host, const char *service) {
    /* требуется поддержать IPv4 и IPv6 и попробовать все подходящие адреса */
}
Вопрос 9 из 30
Что неверно при чтении 32-битной длины из сетевого буфера?
CC17
uint32_t n=ntohl(*(const uint32_t*)buf);
Вопрос 10 из 30
Что возвращает успешный вызов `inet_ntop`?
CC17
char text[INET6_ADDRSTRLEN];
const char *p=inet_ntop(AF_INET6,&a6,text,sizeof text);
Вопрос 11 из 30
Почему нельзя считать, что один `send` всегда принимает весь буфер?
CC17
ssize_t n=send(fd,buf+off,len-off,0);
Вопрос 12 из 30
Один `recv` вернул только половину заголовка. Что это означает для TCP?
Вопрос 13 из 30
Как обработать recv==-1 и errno==EINTR?
CC17
do { n=recv(fd,buf,cap,0); } while(n<0 && errno==EINTR);
Вопрос 14 из 30
Почему нельзя читать payload сразу после получения четырёх байтов длины без лимита?
CC17
uint32_t n = read_u32_be(hdr);
void *payload = malloc((size_t)n);
if (!payload) return OUT_OF_MEMORY;
return recv_all(fd, payload, (size_t)n);
Вопрос 15 из 30
Что неверно в безусловной записи `buf[n] = 0` после `recv`?
CC17
char buf[1024];
ssize_t n=recv(fd,buf,sizeof buf,0);
buf[n]=0;
Вопрос 16 из 30
Что означает recv==0 на TCP-сокете?
Вопрос 17 из 30
Зачем `shutdown(fd,SHUT_WR)`?
CC17
send_all(fd, request, request_size);
/* Сервер начнёт отвечать только после EOF в направлении от клиента,
   но клиенту ещё нужно прочитать ответ из того же сокета. */
Вопрос 18 из 30
Почему закрытие дескриптора в одном потоке при использовании другим требует согласованного протокола?
Вопрос 19 из 30
Что даёт таймаут бездействия соединения?
Вопрос 20 из 30
Почему `close` после частичного ответа не доказывает, что клиент получил все байты?
Вопрос 21 из 30
Какая команда пакета iproute2 показывает слушающие TCP-сокеты и, при достаточных правах, связанные процессы?
CДиагностика Linux
sudo ss ____
Вопрос 22 из 30
Как проверить ошибку парсера, который считает один `recv` одним сообщением?
Вопрос 23 из 30
Какие данные нужно сопоставить, если `send` надолго блокируется и причина неясна?
CПлан диагностики
ssize_t n = send(fd, buf, len, 0);
/* вызов иногда не возвращается в ожидаемое время */
Вопрос 24 из 30
Почему опасно журналировать полезную нагрузку сетевого сообщения целиком?
Вопрос 25 из 30
Как локально воспроизвести короткие чтения TCP?
CC17
unsigned char header[4];
size_t have = 0;
while (have < sizeof header) {
    ssize_t n = recv(fd, header + have, sizeof header - have, 0);
    if (n <= 0) break;
    have += (size_t)n;
}
/* нужен управляемый тест, в котором заголовок приходит частями */
Вопрос 26 из 30
Как безопасно вычислить суммарный размер заголовка и полезной нагрузки?
CC17
size_t total = HEADER + payload_len;
/* входная длина получена из сети */
Вопрос 27 из 30
Чем TCP не обеспечивает защиту сам по себе?
Вопрос 28 из 30
Как клиент типа slowloris расходует ресурсы сервера?
Вопрос 29 из 30
Почему нельзя сразу выполнять `malloc(length)` после чтения недоверенного поля длины?
CC17
uint64_t length=decode64(hdr);
void *p=malloc((size_t)length);
Вопрос 30 из 30
Какой дизайн устойчивее при обработке тысяч клиентов?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу