Проблема с циклом while() в коде с сокетами

У меня есть простой цикл while() в моем коде C, но printf() не работает должным образом, сервер подключает к нему новых клиентов, и здесь нет проблем с новыми подключениями.

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>

int clients_fd[100];
int cnt = 0;

int main() {
    int serv_sock = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in serv_addr;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(8080);
    serv_addr.sin_family = AF_INET;

    bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
    listen(serv_sock, 100);

    while (cnt < 100) {
        int client_sock = accept(serv_sock, NULL, NULL);
        clients_fd[cnt] = client_sock;
        printf("cnt is %d", cnt);
        cnt++;
    }

    return 0;
}

при вызове библиотечных функций C: socket(), bind(), accept(), listen() всегда проверяйте возвращаемое значение, чтобы убедиться в отсутствии ошибок. Если произошла ошибка, вызовите: perror( "my error message" );, чтобы сообщить пользователю, что произошла ошибка, а также ваше сообщение об ошибке и текстовое сообщение от системы о том, почему система считает, что произошла ошибка, все для stderr

user3629249 23.02.2019 22:45

относительно: int client_sock = accept(serv_sock, NULL, NULL); То, что код перекрывает предыдущее значение сокета, не означает, что система удалила исходный экземпляр сокета. Предложите вызвать close( client_socket ); at the bottom of the loop Note: before exiting the program also need to call: close(serv_socket);`

user3629249 23.02.2019 22:48

OT: относительно: listen(serv_sock, 100); размер очереди может быть всего 3, но при этом всегда обрабатывать любые новые клиентские подключения (если только сотни клиентов не пытаются подключиться)

user3629249 23.02.2019 22:50

относительно: int clients_fd[100]; есть системный параметр, который ограничивает разрешенное количество открытых сокетов. И количество одновременных клиентов (в вашем опубликованном коде) не более 1, поэтому нет необходимости в массиве номеров клиентских сокетов.

user3629249 23.02.2019 22:52

относительно: printf("cnt is %d", cnt); потоки символов буферизуются. поэтому поток stdout фактически не выводится на терминал до тех пор, пока: 1) буфер не переполнится, 2) не будет выполнена операция ввода, 3) не будет вызвана функция: fflush( stdout ) или 4) не завершится программа, или 5) вывод из printf() включает последовательность '\n' (новая строка). Предлагаем использовать: printf("cnt is %d\n", cnt); Обратите внимание на последовательность новой строки в конце строки формата.

user3629249 23.02.2019 22:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключается в буферизации строк здесь:

printf("cnt is %d", cnt);

так что вы не получите вывод в ближайшее время, так как блоки accept(). Просто добавьте новую строку:

printf("cnt is %d\n", cnt);

Это должно решить вашу проблему.

Спасибо за вашу помощь, сэр!

Jotaro Joestar 23.02.2019 16:38

Другие вопросы по теме