Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Broken pipe


Автор: theworldcreator 2.6.2011, 18:17
Пишу сервер раздающий данные клиентам. В бесконечном цикле смотрим не появилось ли чего на listen сокете -- если появилось обрабатываем запрос и отправляем ответ.
Написано на C
Код

FD_ZERO(&tmp_set);
FD_SET(sockfd_out, &tmp_set);
while((select(sockfd_out+1, &tmp_set, NULL, NULL, &tv) > 0) && (FD_ISSET(sockfd_out, &tmp_set) != 0)){
    sock = accept(sockfd_out, (struct sockaddr *) &serv_out, &serv_out_len);
}
tmp_set = master_out_read_set;
len = select(read_socket_max_fd+1, &tmp_set, NULL, NULL, &tv);
if(len > 0){
    for(i = 0; i < READ_SOCKETS_COUNT; i++){
        if(FD_ISSET(read_sockets[i].fd, &tmp_set)){
            send(read_sockets[i].fd, data, strlen(data), 0);
        }
    }
}

Исходный код полностью тут: https://github.com/theWorldCreator/Fviewer/blob/master/server/proxy_server.c
Когда клиент и сервер на одном компьютере -- все идеально, мой ноутбук выдерживает и серверную часть и 1200 клиентов каждый из которых посылает по запросу раз в 5 секунд (на большее просто оперативной памяти не хватило, а сервер тратил 12 процентов процессора и мегабайт оперативной памяти).
А вот после перенесения на vps уже после 400 клиентов программа завершается со словами "Broken pipe"
Подскажите, пожалуйста, в какую сторону копать
Спасибо

Автор: afiskon 2.6.2011, 19:20
Классика жанра. SIG_PIPE, получаемый процессом при попытки чтения/записи из/в закрытый сокет или пайп, убивает процесс. Пропишите обработчик этого сигнала.

Автор: theworldcreator 2.6.2011, 19:31
Благодарю!

Автор: theworldcreator 2.6.2011, 20:48
Почитал, я правильно понимаю -- достаточно завести глобальную переменную в которой сохранять сокет, с которым работаешь в данный момент, потом повесить обработчик вот так:
Код

#include <signal.h>
signal (SIGPIPE, handler);

и в обработчике сбрасывать текущий сокет в ноль и делать пометку -- не использовать его более, верно?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)