java.net.BindException: Address already in use

SergeyP

Member
Добрый день.
Иногда при подключении к трансляции соединение не устанавливается, а в клиентских расширенных логах пишет:
Code:
20:40:35,267 INFO             Component - API-ASYNC-pool-8-thread-16 Component created, start socket: 52680
20:40:35,267 ERROR       IceMediaStream - API-ASYNC-pool-8-thread-16 Can not create com.flashphoner.ice.Component Address already in use (Bind failed)
j
Поискал логи за несколько дней, происходит довольно часто, причем это не один конкретный порт, а в принципе случайный порт из диапазона в настройках.
Code:
media_port_from        =31001
media_port_to          =65000
Ну, может не случайный, происходит с портами ближе к верхней границе. некоторые примеры: 50930, 51516, 51982, 52680, 56058, 56082, 59204, 59948, 60890.
На сервере находится еще одно приложение, но оно биндится на порт 9006, никакое другое ПО на сервере не работает с портами 50000 и выше.
 

Attachments

Max

Administrator
Staff member
Добрый день
Какая версия сервера?
Похожая проблема возникала, но была исправлена достаточно давно.
 

SergeyP

Member
Пару дней назад поставил последнюю на тот момент версию 5.1.3511.
До этого стоял один из последних билдов версии 5.0.
Судя по логам, проблема биндинга на порт происходит в обеих версиях.
 

SergeyP

Member
На всякий случай вот полный конфиг.
Сервер не находится за VPN или чем-то таким, поэтому в ip и ip_local прописан просто айпи сервера, согласно инструкции и не на 100% уверен в правильности.

Code:
ip                     =178.218.213.37
ip_local               =178.218.213.37
port_from              =30000
port_to                =31000
media_port_from        =31001
media_port_to          =65000
waiting_answer         =60
user_agent             =Flashphoner/1.0
balance_header         =balance
cost_header            =cost
video_enabled          =true
domain                 =
outbound_proxy         =
outbound_port          =
log_level              =5
enable_context_logs    =false
rtp_activity_detecting =true,60
sip_msg_listener       =com.flashphoner.sdk.sip.ChangeCallIdListener
call_record_listener   =com.flashphoner.server.client.DefaultCallRecordListener
dtmf                         =rfc2833
auto_login_url         =/usr/local/FlashphonerWebCallServer/conf/account.xml
get_callee_url         =/usr/local/FlashphonerWebCallServer/conf/callee.xml
codecs                   =opus,alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,vp8,h264,flv,mpv
codecs_exclude_sip       =mpeg4-generic,flv,mpv
codecs_exclude_streaming =flv,telephone-event
codecs_exclude_sip_rtmp  =opus,g729,g722,mpeg4-generic,vp8,mpv
on_record_hook_script  =on_record_hook.sh
rtmp_transponder_stream_name_prefix =rtmp_
ws.port                 =8080
wss.port                =8443
wss.keystore.password   =password
wss.cert.password       =password
rtmp.port               =1935
rtmfp.port              =1935
keep_alive.algorithm       =HIGH_LEVEL
keep_alive.peer_interval   =2000
keep_alive.server_interval =5000
keep_alive.probes          =10
video_reliable          =partial
audio_reliable          =partial
audio_frames_per_packet =6
burst_avoidance_count   =100
flush_audio_interval    =80
flush_video_interval    =0

#The part below is moved from server.properties...
#Config

ws.port                 =8080

wss.port                =8443
#File will be located in conf directory
wss.keystore.password   =password
wss.cert.password       =password

rtmp.port               =1935
rtmfp.port                       =1935

#keep_alive_algorithm may be INTERNAL, NONE, HIGH_LEVEL
keep_alive.algorithm       =HIGH_LEVEL
keep_alive.peer_interval   =2000
keep_alive.server_interval =5000
keep_alive.probes          =10


#Reliability: on, partial, off
video_reliable          =partial
audio_reliable          =partial

audio_frames_per_packet =6
burst_avoidance_count   =100
flush_audio_interval    =80
flush_video_interval    =0

hls_server_enabled=true

record_streams = false

webrtc_cc_min_bitrate=1000000
webrtc_cc_max_bitrate=1000000

# logging
enable_extended_logging = true
client_log_level = INFO
keep_extended_logs_max_days=1

stun_freshness_timeout=1000000000
webrtc_cc2_bitrate_overuse_event_threshold=1
 

Max

Administrator
Staff member
Иногда при подключении к трансляции соединение не устанавливается
Пришлите полный файл лога при котором воспроизводится эта проблема.
support@flashphoner.com
IceMediaStream - API-ASYNC-pool-8-thread-16 Can not create com.flashphoner.ice.Component Address already in use
Эта ошибка говорит о том что UDP порт занят. Но в этом случае должен взяться следующий порт по списку.

Если есть возможность воспроизвести проблему для конкретного подключения, пришлите отладочные логи в соответствии с этой инструкцией
Мы попробуем воспроизвести проблему с занятым портом у себя. По результатам отпишем. WCS-1462.
 

SergeyP

Member
Отправил несколько клиентских логов на почту.
В одном из логов можно также видеть следующиее исключение, скорее всего уже другая проблема.

Code:
16:41:36,986 ERROR   StunDatagramSocket - Stun receiver udp/57278 Can not create STUN message: Could not create HMAC-SHA1 request encoding:
java.lang.IllegalArgumentException: Could not create HMAC-SHA1 request encoding:
        at org.ice4j.attribute.MessageIntegrityAttribute.calculateHmacSha1(Unknown Source)
        at org.ice4j.attribute.MessageIntegrityAttribute.encode(Unknown Source)
        at org.ice4j.message.Message.encode(Unknown Source)
        at com.flashphoner.ice.StunDatagramSocket.sendBindingRequest(Unknown Source)
        at com.flashphoner.ice.StunDatagramSocket.sendBindingRequest(Unknown Source)
        at com.flashphoner.ice.StunDatagramSocket.access$1400(Unknown Source)
        at com.flashphoner.ice.StunDatagramSocket$ReceiveThread.run(Unknown Source)
Caused by: java.lang.ArrayIndexOutOfBoundsException
        at sun.security.provider.DigestBase.engineUpdate(DigestBase.java:114)
        at sun.security.provider.SHA.implDigest(SHA.java:94)
        at sun.security.provider.DigestBase.engineDigest(DigestBase.java:181)
        at java.security.MessageDigest$Delegate.engineDigest(MessageDigest.java:597)
        at java.security.MessageDigest.digest(MessageDigest.java:392)
        at com.sun.crypto.provider.HmacCore.engineDoFinal(HmacCore.java:208)
        at javax.crypto.Mac.doFinal(Mac.java:561)
        at javax.crypto.Mac.doFinal(Mac.java:636)
        ... 7 more
 

Max

Administrator
Staff member
Can not create com.flashphoner.ice.Component Address already in use (Bind failed)
Эту проблему воспроизвели. Готовим фикс.

Пока есть рекомендация настроить в Linux диапазон портов, который будет использовать система по-умолчанию.
/proc/sys/net/ipv4/ip_local_port_range

Любой системный процесс, требующий сетевого взаимодействия в качестве клиента (DNS, mail, torrent, etc) может брать локальные порты в стандартном диапазоне 32768-61000.
Чтобы устранить пересечение портов с WCS, сконфигурируйте этот диапазон чтобы он не пересекался с портами WCS.
 

SergeyP

Member
Напишите пожалуйста в этом топике когда версия с исправлением будет доступна.
Спасибо
 

SergeyP

Member
От чего зависит количество используемых портовв диапазоне от media_port_from до media_port_to?
Как посчитать сколько портов нам нужно в этом диапазоне?
Может быть нам и не нужно 22 тысячи портов и можно уменьшить этот диапазон.
 

Max

Administrator
Staff member
Проблема исправлена в версии 5.1.3528
Количество портов зависит от количества клиентских соединений. Для публикации или воспроизведения одного потока одним клиентом необходимо два порта на сервере для обмена медиаданными, один для аудио трафика и один для видео.
 

SergeyP

Member
Спасибо! Обновился до версии 5.1.3529, пока ошибок с портами не было, будем наблюдать.
Заметил еще одно исключение часто появляется в клиентских логах:
Code:
02:14:51,967 ERROR   StunDatagramSocket - Stun receiver udp/62990 Can not create STUN message: Could not create HMAC-SHA1 request encoding:
java.lang.IllegalArgumentException: Could not create HMAC-SHA1 request encoding:
        at org.ice4j.attribute.MessageIntegrityAttribute.calculateHmacSha1(Unknown Source)
        at org.ice4j.attribute.MessageIntegrityAttribute.encode(Unknown Source)
        at org.ice4j.message.Message.encode(Unknown Source)
        at com.flashphoner.ice.StunDatagramSocket.sendBindingRequest(Unknown Source)
        at com.flashphoner.ice.StunDatagramSocket.sendBindingRequest(Unknown Source)
        at com.flashphoner.ice.StunDatagramSocket.access$1400(Unknown Source)
        at com.flashphoner.ice.StunDatagramSocket$ReceiveThread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: Missing argument
        at javax.crypto.spec.SecretKeySpec.<init>(SecretKeySpec.java:93)
        ... 7 more
Полный лог приложил.
 

Attachments

Max

Administrator
Staff member
java.lang.IllegalArgumentException: Could not create HMAC-SHA1 request encoding:
По этой проблеме есть внутренний тикет WCS-1344.
Отпишем как только будут новости по его фиксу.
 

SergeyP

Member
Ошибки BindException все еще появляются в 5.1.3529, хотя в гораздо меньшем масштабе - 1-3 в день и не каждый день.
Не то что бы это было супер критично, но когда такое происходит, то судя по логам соединение обрывается. Пользователи жалуются что трансляция либо не создается, либо не проигрывается и это мешает диагностировать другие проблемы.
Сегодняшние логи в аттаче.
 

Attachments

Max

Administrator
Staff member
Попробуйте обновиться до последней доступной версии с этой страницы.
Если проблема продолжит воспроизводиться, вероятно, потребуется SSH-доступ к Вашему серверу.
 

Max

Administrator
Staff member
"java.lang.IllegalArgumentException: Could not create HMAC-SHA1 request encoding" - исправлено в версии 5.1.3571.
 
Top