The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Broken Pipe в TCL, массовый обрыв коннектов"
Отправлено KeeperR, 26-Апр-06 19:55 
Здравствуйте,

Вообщем, написал я демон для чата, на TCL. Функционально работает замечательно, но вот проблема. Например, если в чате сдит народ, не важно сколько. То в непредсказуемый момент может оборваться соединения, порядка у 40-70% пользователей.
Ошибка, которая возникает при обрыве соединений - broken pipe.
can't flush sock#xxx broken pipe

вот несколько процедур, их части:

proc connection {socket clientAddress clientPort} {
    # Отключаем блокировку сокета
    fconfigure $socket -blocking 0
    
    # Проверка на игнор хост
    if {[array exists ignored_host] && [info exists ignored_host($clientAddress)]} {
        # Хост игнорируется
        catch {close $socket}
                # лишний код убрал
        return 0
    }

        fileevent $socket readable [list read_from_socket $socket $clientAddress]
}

# Процедура чтения информации из сокета
proc read_from_socket { socket clientAddress} {
        
    # Читаем информацию из сокета
    if {[catch {set len [gets $socket data] } err] } {
        close_socket $socket "connection time out"
        return 0
    }


    if {[eof $socket]} {
        close_socket $socket "EOF"
        return 0
    }


    # Если никакой информации в сокет не передано, возвращаемся
    if {$len < 0 } {
        if {[fblocked $socket]} {
            echo "Socket $socket get's len -1, but socket is blocked, continue";
            return 0
        }
        close_socket $socket "EOF, READ EVENT, CONNECTION BROKEN: get's len -1 and socket is unbloked"
        return 0
    }
    

    if {$len == 0} {
        return 0
    }
...
...
...

# Процедура отправки сообщения в сокет
proc out { socket msg nonewline } {
        
    # Читаем информацию из сокета
    if {[catch {set len [gets $socket line] } err] } {
        close_socket $socket "connection time out"
        return 0
    }


    if {[eof $socket]} {
        close_socket $socket "EOF"
        return 0
    }


    # Если сокет сломан
    if {$len < 0 } {
        if {[fblocked $socket] != 1} {
        close_socket $socket "EOF, WRITE EVENT, CONNECTION BROKEN: get's len -1 and socket is unbloked"
        return 0
        }
    }

    # Посылаем сообщение в сокет, если происходит ошибка, то убием сокет
        if { [ catch {
        if {$nonewline == 1} {
            puts -nonewline $socket $msg
            } else {
                puts $socket $msg
                }
                flush $socket
                } err ] } {
            #Убиваем сокет
            close_socket $socket "broken pipe"
                        return 0
                        }
        return 0
}

#
# Это в теле скрипта
#

catch {socket -server connection -myaddr $host $port}

Собственно, вся проблема в том, что рубиться очень много конектов в одну секунду, обычно, раз в час

Как можно решить эту проблему?

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру