Страница 1 из 1

udpxy + FreeBSD 9.0

Добавлено: 2012-01-15 15:18:40
k-nike
Долгое время мучился с igmpproxy, но в итоге узнал про udpxy, поставил и сразу все заработало.
Пару дней назад обновил фряху до последнего релиза, udpxy тоже последний из портов. Заметил появившийся баг:
Если в локальной сети кто-то смотрит, к примеру, 1-ый канал, то другой пользователь этот канал уже не может смотреть, другие каналы - легко.
Полагаю, что проблема где-то в ядре или у провайдера (но это конечно, маловероятно), так как и с параметрами udpxy игрался, и PF вкючал/отключал, и перекомпилировал udpxy. Не знаю что еще смотреть.
Ошибка выходит такая:

Код: Выделить всё

udpxy[4325]: setup_mcast_listener: bind: Address already in use
Более подробная:

Код: Выделить всё

2012-01-15 16:14:53.196086 MSK	c(4386)	write_buf: write: Broken pipe
2012-01-15 16:14:53.196171 MSK	c(4386)	Exited relay loop: received=[1316], sent=[-1], quit=[0]
2012-01-15 16:14:53.196334 MSK	c(4386)	multicast-group [DROP]
2012-01-15 16:14:53.196469 MSK	c(4386)	Mcast listener socket=[2] closed
2012-01-15 16:14:53.196683 MSK	c(4386)	Child process=[4386] exits with rc=[0]
2012-01-15 16:14:53.197301 MSK	S(4317)	*** Caught SIGCHLD (20) ***
2012-01-15 16:14:53.197457 MSK	S(4317)	Waiting on exited children
2012-01-15 16:14:53.197551 MSK	S(4317)	Client [4386] has exited.
2012-01-15 16:14:53.197652 MSK	S(4317)	Deleted client: pid=[4386]
2012-01-15 16:14:53.197688 MSK	S(4317)	Cleaned up 1 children, 1 still running
2012-01-15 16:14:53.197788 MSK	S(4317)	INTERRUPTED, yet will continue.
2012-01-15 16:14:53.197869 MSK	S(4317)	Waiting for input from [2] fd's, NO timeout
2012-01-15 16:14:55.412925 MSK	S(4317)	No children exited since last check
2012-01-15 16:14:55.413012 MSK	S(4317)	Got 1 requests
2012-01-15 16:14:55.413048 MSK	S(4317)	Accepting new connection
2012-01-15 16:14:55.413169 MSK	S(4317)	Accepted socket=[6] from 192.168.1.30:36768 n=1/nmax=16
2012-01-15 16:14:55.413212 MSK	S(4317)	Accepting new connection
2012-01-15 16:14:55.413276 MSK	S(4317)	Nothing more to accept
2012-01-15 16:14:55.413312 MSK	S(4317)	accept_requests: Sockets accepted: [1]
2012-01-15 16:14:55.413361 MSK	S(4317)	Waiting for input from [3] fd's, with timeout
2012-01-15 16:14:55.414208 MSK	S(4317)	No children exited since last check
2012-01-15 16:14:55.414259 MSK	S(4317)	Got 1 requests
pre-process sockets [1]: 6
2012-01-15 16:14:55.414356 MSK	S(4317)	acting on accepted socket [6] (1/1)
2012-01-15 16:14:55.414397 MSK	S(4317)	Reading command from socket [6]
2012-01-15 16:14:55.414447 MSK	S(4317)	HTTP buffer [60 bytes] received
GET /udp/239.255.2.8:1234 HTTP/1.1
Host: 192.168.1.9:4022
2012-01-15 16:14:55.414513 MSK	S(4317)	Request=[udp/239.255.2.8:1234], length=[20]
2012-01-15 16:14:55.414545 MSK	S(4317)	Command [udp] with params [239.255.2.8:1234] read from socket=[6]
2012-01-15 16:14:55.414586 MSK	S(4317)	udp_relay : new_socket=[6] param=[239.255.2.8:1234]
2012-01-15 16:14:55.415040 MSK	S(4317)	Client process=[4387] started for socket=[6]
2012-01-15 16:14:55.415092 MSK	S(4317)	Added client: pid=[4387], maddr=[239.255.2.8], mport=[1234], saddr=[192.168.1.30], sport=[36768]
2012-01-15 16:14:55.415267 MSK	S(4317)	process_requests: closing accepted socket [6]
2012-01-15 16:14:55.415287 MSK	c(4387)	min socket buffer = [65536], max space to use = [1500], Rmsgs = [1]
2012-01-15 16:14:55.415336 MSK	c(4387)	Setting up multicast listener
2012-01-15 16:14:55.415347 MSK	S(4317)	Processed [1/1] accepted sockets
newly-accepted sockets [1]: -1
2012-01-15 16:14:55.415415 MSK	S(4317)	All accepted sockets processed
2012-01-15 16:14:55.415458 MSK	S(4317)	Waiting for input from [2] fd's, NO timeout
2012-01-15 16:14:55.415481 MSK	c(4387)	current receive buffer size is [42080] bytes for socket [2]
2012-01-15 16:14:55.415557 MSK	c(4387)	receive buffer size set to [65536] bytes for socket [2]
2012-01-15 16:14:55.416153 MSK	c(4387)	setup_mcast_listener: bind: Address already in use
2012-01-15 16:14:55.416379 MSK	c(4387)	Sent HTTP response code=[500], reason=[Service error] to socket=[6]
HTTP/1.1 500 Service error
Content-Type:application/octet-stream


2012-01-15 16:14:55.416743 MSK	c(4387)	Child process=[4387] exits with rc=[-1]
2012-01-15 16:14:55.417604 MSK	S(4317)	*** Caught SIGCHLD (20) ***
2012-01-15 16:14:55.417729 MSK	S(4317)	Waiting on exited children
2012-01-15 16:14:55.417852 MSK	S(4317)	Client [4387] has exited.
2012-01-15 16:14:55.417948 MSK	S(4317)	Deleted client: pid=[4387]
2012-01-15 16:14:55.418043 MSK	S(4317)	Cleaned up 1 children, 1 still running
2012-01-15 16:14:55.418137 MSK	S(4317)	INTERRUPTED, yet will continue.
2012-01-15 16:14:55.418225 MSK	S(4317)	Waiting for input from [2] fd's, NO timeout
2012-01-15 16:14:55.418329 MSK	S(4317)	No children exited since last check
2012-01-15 16:14:55.418439 MSK	S(4317)	Got 1 requests
2012-01-15 16:14:55.418493 MSK	S(4317)	Accepting new connection
2012-01-15 16:14:55.418574 MSK	S(4317)	Accepted socket=[6] from 192.168.1.30:36769 n=1/nmax=16
2012-01-15 16:14:55.418615 MSK	S(4317)	Accepting new connection
2012-01-15 16:14:55.418650 MSK	S(4317)	Nothing more to accept
2012-01-15 16:14:55.418683 MSK	S(4317)	accept_requests: Sockets accepted: [1]
2012-01-15 16:14:55.418732 MSK	S(4317)	Waiting for input from [3] fd's, with timeout
2012-01-15 16:14:55.418873 MSK	S(4317)	No children exited since last check
2012-01-15 16:14:55.418946 MSK	S(4317)	Got 1 requests
pre-process sockets [1]: 6
2012-01-15 16:14:55.419039 MSK	S(4317)	acting on accepted socket [6] (1/1)
2012-01-15 16:14:55.419094 MSK	S(4317)	Reading command from socket [6]
2012-01-15 16:14:55.419146 MSK	S(4317)	HTTP buffer [60 bytes] received
GET /udp/239.255.2.8:1234 HTTP/1.0
Host: 192.168.1.9:4022
2012-01-15 16:14:55.419223 MSK	S(4317)	Request=[udp/239.255.2.8:1234], length=[20]
2012-01-15 16:14:55.419278 MSK	S(4317)	Command [udp] with params [239.255.2.8:1234] read from socket=[6]
2012-01-15 16:14:55.419329 MSK	S(4317)	udp_relay : new_socket=[6] param=[239.255.2.8:1234]
2012-01-15 16:14:55.419803 MSK	S(4317)	Client process=[4388] started for socket=[6]
2012-01-15 16:14:55.419877 MSK	S(4317)	Added client: pid=[4388], maddr=[239.255.2.8], mport=[1234], saddr=[192.168.1.30], sport=[36769]
2012-01-15 16:14:55.420032 MSK	S(4317)	process_requests: closing accepted socket [6]
2012-01-15 16:14:55.420097 MSK	S(4317)	Processed [1/1] accepted sockets
2012-01-15 16:14:55.420095 MSK	c(4388)	min socket buffer = [65536], max space to use = [1500], Rmsgs = [1]
newly-accepted sockets [1]: -1
2012-01-15 16:14:55.420169 MSK	c(4388)	Setting up multicast listener
2012-01-15 16:14:55.420213 MSK	S(4317)	All accepted sockets processed
2012-01-15 16:14:55.420267 MSK	S(4317)	Waiting for input from [2] fd's, NO timeout
2012-01-15 16:14:55.420339 MSK	c(4388)	current receive buffer size is [42080] bytes for socket [2]
2012-01-15 16:14:55.420399 MSK	c(4388)	receive buffer size set to [65536] bytes for socket [2]
2012-01-15 16:14:55.421001 MSK	c(4388)	setup_mcast_listener: bind: Address already in use
2012-01-15 16:14:55.421183 MSK	c(4388)	Sent HTTP response code=[500], reason=[Service error] to socket=[6]
HTTP/1.1 500 Service error
Content-Type:application/octet-stream


2012-01-15 16:14:55.421488 MSK	c(4388)	Child process=[4388] exits with rc=[-1]
2012-01-15 16:14:55.422004 MSK	S(4317)	*** Caught SIGCHLD (20) ***
2012-01-15 16:14:55.422086 MSK	S(4317)	Waiting on exited children
2012-01-15 16:14:55.422155 MSK	S(4317)	Client [4388] has exited.
2012-01-15 16:14:55.422202 MSK	S(4317)	Deleted client: pid=[4388]
2012-01-15 16:14:55.422254 MSK	S(4317)	Cleaned up 1 children, 1 still running
2012-01-15 16:14:55.422301 MSK	S(4317)	INTERRUPTED, yet will continue.
2012-01-15 16:14:55.422346 MSK	S(4317)	Waiting for input from [2] fd's, NO timeout
2012-01-15 16:14:55.422620 MSK	S(4317)	No children exited since last check
2012-01-15 16:14:55.422662 MSK	S(4317)	Got 1 requests
2012-01-15 16:14:55.422694 MSK	S(4317)	Accepting new connection
2012-01-15 16:14:55.422759 MSK	S(4317)	Accepted socket=[6] from 192.168.1.30:36770 n=1/nmax=16
2012-01-15 16:14:55.422858 MSK	S(4317)	Accepting new connection
2012-01-15 16:14:55.422911 MSK	S(4317)	Nothing more to accept
2012-01-15 16:14:55.422956 MSK	S(4317)	accept_requests: Sockets accepted: [1]
2012-01-15 16:14:55.423004 MSK	S(4317)	Waiting for input from [3] fd's, with timeout
2012-01-15 16:14:55.423065 MSK	S(4317)	No children exited since last check
2012-01-15 16:14:55.423108 MSK	S(4317)	Got 1 requests
pre-process sockets [1]: 6
2012-01-15 16:14:55.423326 MSK	S(4317)	acting on accepted socket [6] (1/1)
2012-01-15 16:14:55.423383 MSK	S(4317)	Reading command from socket [6]
2012-01-15 16:14:55.423438 MSK	S(4317)	HTTP buffer [60 bytes] received
GET /udp/239.255.2.8:1234 HTTP/1.0
Host: 192.168.1.9:4022
2012-01-15 16:14:55.423605 MSK	S(4317)	Request=[udp/239.255.2.8:1234], length=[20]
2012-01-15 16:14:55.423678 MSK	S(4317)	Command [udp] with params [239.255.2.8:1234] read from socket=[6]
2012-01-15 16:14:55.423718 MSK	S(4317)	udp_relay : new_socket=[6] param=[239.255.2.8:1234]
2012-01-15 16:14:55.424085 MSK	S(4317)	Client process=[4389] started for socket=[6]
2012-01-15 16:14:55.424153 MSK	S(4317)	Added client: pid=[4389], maddr=[239.255.2.8], mport=[1234], saddr=[192.168.1.30], sport=[36770]
2012-01-15 16:14:55.424403 MSK	c(4389)	min socket buffer = [65536], max space to use = [1500], Rmsgs = [1]
2012-01-15 16:14:55.424429 MSK	S(4317)	process_requests: closing accepted socket [6]
2012-01-15 16:14:55.424515 MSK	c(4389)	Setting up multicast listener
2012-01-15 16:14:55.424586 MSK	S(4317)	Processed [1/1] accepted sockets
newly-accepted sockets [1]: -1
2012-01-15 16:14:55.424716 MSK	S(4317)	All accepted sockets processed
2012-01-15 16:14:55.424788 MSK	c(4389)	current receive buffer size is [42080] bytes for socket [2]
2012-01-15 16:14:55.424855 MSK	S(4317)	Waiting for input from [2] fd's, NO timeout
2012-01-15 16:14:55.424873 MSK	c(4389)	receive buffer size set to [65536] bytes for socket [2]
2012-01-15 16:14:55.425581 MSK	c(4389)	setup_mcast_listener: bind: Address already in use
2012-01-15 16:14:55.425885 MSK	c(4389)	Sent HTTP response code=[500], reason=[Service error] to socket=[6]
HTTP/1.1 500 Service error
Content-Type:application/octet-stream


2012-01-15 16:14:55.426212 MSK	c(4389)	Child process=[4389] exits with rc=[-1]
2012-01-15 16:14:55.426746 MSK	S(4317)	*** Caught SIGCHLD (20) ***
2012-01-15 16:14:55.426852 MSK	S(4317)	Waiting on exited children
2012-01-15 16:14:55.426922 MSK	S(4317)	Client [4389] has exited.
2012-01-15 16:14:55.426972 MSK	S(4317)	Deleted client: pid=[4389]
2012-01-15 16:14:55.427023 MSK	S(4317)	Cleaned up 1 children, 1 still running
2012-01-15 16:14:55.427071 MSK	S(4317)	INTERRUPTED, yet will continue.
2012-01-15 16:14:55.427115 MSK	S(4317)	Waiting for input from [2] fd's, NO timeout
Ytlkjlkj
Yt bvtz djpvj;yjcnb

Re: udpxy + FreeBSD 9.0

Добавлено: 2012-03-08 21:13:36
Alex Keda
а чё это такое?

Re: udpxy + FreeBSD 9.0

Добавлено: 2012-06-05 10:37:09
ivol
Та же фигня. Пришлось установить FreeBSD 8, с ней таких проблем нет.
Но есть другая проблема. Если каналы смотрят много людей, то периодически прекращается ретрансляция некоторых каналов.
Выглядит это так: загружаю плэй-лист с каналами, выбираю канал из списка, смотрю, через несколько минут воспроизведение канала прекращается и плеер переходит к воспроизведению следующего в списке канала. Трансляция "заткнувшегося" канала возобновляется через минуту-две.
Пробовал и Gentoo+UDPXY, результат тот же.

Re: udpxy + FreeBSD 9.0

Добавлено: 2012-06-12 13:51:10
_tpf
Была такая же проблема.

Решается вот так:

Код: Выделить всё

cd /usr/ports/net/udpxy
make patch
Открываем файл work/udpxy-1.0.21-2/netop.c (ну или смотря какая у вас версия порта) любимым редактором.
В коде находим функцию setup_mcast_listener, а в ней строки

Код: Выделить всё

rc = setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR,
                         &ON, sizeof(ON) );
Меняем это дело на вот такое:

Код: Выделить всё

rc = setsockopt( sockfd, SOL_SOCKET, SO_REUSEPORT,
                         &ON, sizeof(ON) );
Сохраняем.
Пишем

Код: Выделить всё

make && make install 
И будет работать как родной

Re: udpxy + FreeBSD 9.0

Добавлено: 2012-06-13 9:34:57
_tpf
ivol писал(а):Та же фигня. Пришлось установить FreeBSD 8, с ней таких проблем нет.
Но есть другая проблема. Если каналы смотрят много людей, то периодически прекращается ретрансляция некоторых каналов.
Выглядит это так: загружаю плэй-лист с каналами, выбираю канал из списка, смотрю, через несколько минут воспроизведение канала прекращается и плеер переходит к воспроизведению следующего в списке канала. Трансляция "заткнувшегося" канала возобновляется через минуту-две.
Пробовал и Gentoo+UDPXY, результат тот же.
А много это сколько? больше 40 или меньше? (я сам на 40 проверял - работает нормально).

Вот что можно сделать для того, чтоб понять что происходит:
1. Посмотреть в момент когда у вас прерывается картинка в плеере - не прерывается ли мультикаст поток от провайдера.
2. Попробуйте проверить, поступает ли "All members query" запрос в тот же интерфейс куда потребляется мультикаст. Запрос этот на адрес 224.0.0.1 (или 224.0.0.22, если провайдер юзает igmp v3), должен периодически повторяться, всегда через одинаковое количество времени. В ответ ваша ФриБСД должна отправлять igmp join сообщения как минимум на все группы, которые на данный момент ретранслирует udpxy.
3. Я не знаю как у вас там это построено на физическом уровне (тоесть одна реальная сетевка, а все остальные разбросаны вланами, может быть две сетевки или еще какой вариант) - но.. убедитесь на 100% что не засоряется вся пропускная способность той сетевой карты через которую поступает мультикаст, возможно join мессиджам просто не хватает полосы. Просто вы говорите о большом количестве пользователей, а если учесть что восновном телевизор ганяют в мпег2, где до 5Мбит/с битрейт, и почти всегда трафик iptv приоритезируется, то вполне реально что 20 человек в хлам разорвут 100Мбит сетевку. (за время работы в провайдерах я понял что иногда приходится проверять чуть ли не расположение звезд...).

Re: udpxy + FreeBSD 9.0

Добавлено: 2012-06-13 21:48:18
Kaspian
Спасибо. Помогло!
:)
_tpf писал(а):Была такая же проблема.

Решается вот так:

Код: Выделить всё

cd /usr/ports/net/udpxy
make patch
Открываем файл work/udpxy-1.0.21-2/netop.c (ну или смотря какая у вас версия порта) любимым редактором.
В коде находим функцию setup_mcast_listener, а в ней строки

Код: Выделить всё

rc = setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR,
                         &ON, sizeof(ON) );
Меняем это дело на вот такое:

Код: Выделить всё

rc = setsockopt( sockfd, SOL_SOCKET, SO_REUSEPORT,
                         &ON, sizeof(ON) );
Сохраняем.
Пишем

Код: Выделить всё

make && make install 
И будет работать как родной