Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Broken pipe 
:(
    Опции темы
theworldcreator
Дата 2.6.2011, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



Пишу сервер раздающий данные клиентам. В бесконечном цикле смотрим не появилось ли чего на 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/.../proxy_server.c
Когда клиент и сервер на одном компьютере -- все идеально, мой ноутбук выдерживает и серверную часть и 1200 клиентов каждый из которых посылает по запросу раз в 5 секунд (на большее просто оперативной памяти не хватило, а сервер тратил 12 процентов процессора и мегабайт оперативной памяти).
А вот после перенесения на vps уже после 400 клиентов программа завершается со словами "Broken pipe"
Подскажите, пожалуйста, в какую сторону копать
Спасибо
PM MAIL WWW ICQ   Вверх
afiskon
Дата 2.6.2011, 19:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: 1
Всего: 4



Классика жанра. SIG_PIPE, получаемый процессом при попытки чтения/записи из/в закрытый сокет или пайп, убивает процесс. Пропишите обработчик этого сигнала.
PM MAIL WWW   Вверх
theworldcreator
Дата 2.6.2011, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



Благодарю!
PM MAIL WWW ICQ   Вверх
theworldcreator
Дата 2.6.2011, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



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

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

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

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1001 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.