Здравствуйте,Вообщем, написал я демон для чата, на 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}
Собственно, вся проблема в том, что рубиться очень много конектов в одну секунду, обычно, раз в час
Как можно решить эту проблему?