У меня есть простой цикл 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;
}
относительно: 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);`
OT: относительно: listen(serv_sock, 100); размер очереди может быть всего 3, но при этом всегда обрабатывать любые новые клиентские подключения (если только сотни клиентов не пытаются подключиться)
относительно: int clients_fd[100]; есть системный параметр, который ограничивает разрешенное количество открытых сокетов. И количество одновременных клиентов (в вашем опубликованном коде) не более 1, поэтому нет необходимости в массиве номеров клиентских сокетов.
относительно: printf("cnt is %d", cnt); потоки символов буферизуются. поэтому поток stdout фактически не выводится на терминал до тех пор, пока: 1) буфер не переполнится, 2) не будет выполнена операция ввода, 3) не будет вызвана функция: fflush( stdout ) или 4) не завершится программа, или 5) вывод из printf() включает последовательность '\n' (новая строка). Предлагаем использовать: printf("cnt is %d\n", cnt); Обратите внимание на последовательность новой строки в конце строки формата.





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