/* create a socket listening on port 'port' */
/* if af is PF_UNSPEC more than one socket might be returned */
/* the returned list is dynamically allocated, so caller needs to free it */
int *listensock(const char *port, const int af)
{
struct addrinfo hints, *ai, *r;
int err, maxs, *sock, *socks;
const int on = 1;
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_PASSIVE;
hints.ai_family = af;
hints.ai_socktype = SOCK_STREAM;
err = getaddrinfo(NULL, port, &hints, &ai);
if (err) {
fprintf(stderr, "%s\n", gai_strerror(err));
exit(EX_USAGE);
}
/* Count max number of sockets we can open */
for (maxs = 0, r = ai; r; r = r->ai_next, maxs++)
;
socks = malloc((maxs + 1) * sizeof(int));
if (!socks) {
fprintf(stderr, "couldn't allocate memory for sockets\n");
freeaddrinfo(ai);
exit(EX_OSERR);
}
socks[0] = 0; /* num of sockets counter at start of array */
sock = socks + 1;
for (r = ai; r; r = r->ai_next) {
fprintf(stderr, "trying %d, %d, %d\n",r->ai_family, r->ai_socktype, r->ai_protocol);
*sock = socket(r->ai_family, r->ai_socktype, r->ai_protocol);
if (*sock < 0) {
perror("socket");
continue;
}
if (setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR,
(void *) &on, sizeof(on)) < 0) {
perror("setsockopt(SO_REUSEADDR)");
close(*sock);
continue;
}
#if defined(IPV6_V6ONLY) && !(defined(__FreeBSD__) && __FreeBSD__ < 3)
if (r->ai_family == AF_INET6) {
if (setsockopt(*sock, IPPROTO_IPV6, IPV6_BINDV6ONLY,
(void *) &on, sizeof(on)) < 0) {
perror("setsockopt (IPV6_BINDV6ONLY)");
close(*sock);
continue;
}
}
#endif
if (bind(*sock, r->ai_addr, r->ai_addrlen) < 0) {
perror("bind");
close(*sock);
continue;
}
if (listen(*sock, 5) < 0) {
perror("listen");
close(*sock);
continue;
}
socks[0]++;
sock++;
}
freeaddrinfo(ai);
if (socks[0] == 0) {
fprintf(stderr, "Couldn't bind to any socket\n");
free(socks);
exit(EX_OSERR);
}
return socks;
}
Кол-во дескрипторов процесса.
Пишу сервер.Многопоточный. Принимает коннекты.
Задача стоит в том, чтобы при достижении определенного кол-ва открытых
сокетов, новые коннекты не принимать.(коннекты иногда раскидываются
по разным потокам)
Я ,в принципе, могу опросить каждый тред на кол-во используемых им сокетов, но это долго, мрачно и лишний повод для глюков.
Можно ли как-то спросить у системы сколько дескрипторов использует
программа?
Цитата: fanto
Суть такая:
Пишу сервер.Многопоточный. Принимает коннекты.
Задача стоит в том, чтобы при достижении определенного кол-ва открытых
сокетов, новые коннекты не принимать.(коннекты иногда раскидываются
по разным потокам)
Я ,в принципе, могу опросить каждый тред на кол-во используемых им сокетов, но это долго, мрачно и лишний повод для глюков.
Можно ли как-то спросить у системы сколько дескрипторов использует
программа?
Пишу сервер.Многопоточный. Принимает коннекты.
Задача стоит в том, чтобы при достижении определенного кол-ва открытых
сокетов, новые коннекты не принимать.(коннекты иногда раскидываются
по разным потокам)
Я ,в принципе, могу опросить каждый тред на кол-во используемых им сокетов, но это долго, мрачно и лишний повод для глюков.
Можно ли как-то спросить у системы сколько дескрипторов использует
программа?
Можно создать что-то напоминающее listen sockets и прослушивать колличество открытых сокетов. Если ты будешь пытаться найти вывод подобной информации системными средствами, то с наибольшей долей вероятности то - что ты получить абсолютно не кросплатформенное приложение (думаю не стоит пояснять как это сейчас необходимо и все такое...). На Линюкс допустим будет работать, а вот на BSD системах или в Solaris Environment уже нет. Вот когда в среду Linux, BSD и MacOS X портируют DTrace из Solaris, тогда подобные штуки станут возможными, а пока думаю будет полезным что-то типа listen sockets:
Код:
Возникнут вопросы, могу кинуть готовый исходник, где работает эта функция.