Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
multicast-study
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
multicast-study
Commits
5053ea86
Commit
5053ea86
authored
Apr 29, 2022
by
Kirill Smelkov
Committed by
Léo-Paul Géneau
Apr 29, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
.
parent
7f11d3f6
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
35 additions
and
19 deletions
+35
-19
namespace_demo/tmcast.py
namespace_demo/tmcast.py
+35
-19
No files found.
namespace_demo/tmcast.py
View file @
5053ea86
...
@@ -9,23 +9,35 @@ from socket import socket, AF_INET, SOCK_DGRAM, IPPROTO_UDP, SOL_SOCKET, \
...
@@ -9,23 +9,35 @@ from socket import socket, AF_INET, SOCK_DGRAM, IPPROTO_UDP, SOL_SOCKET, \
SO_REUSEADDR
,
IPPROTO_IP
,
IP_ADD_MEMBERSHIP
,
IP_MULTICAST_TTL
,
IP_MULTICAST_LOOP
,
\
SO_REUSEADDR
,
IPPROTO_IP
,
IP_ADD_MEMBERSHIP
,
IP_MULTICAST_TTL
,
IP_MULTICAST_LOOP
,
\
inet_aton
,
INADDR_ANY
inet_aton
,
INADDR_ANY
from
golang
import
b
from
golang
import
sync
,
context
group4
=
'224.1.1.1'
group4
=
'224.1.1.1'
group6
=
'XXX'
group6
=
'XXX'
port
=
5678
port
=
5678
#
open_rx returns function to receive from
group:port.
#
mjoin returns socket prepated to send/receive to/from multicast
group:port.
def
open_rx
(
group
,
port
):
def
mjoin
(
group
,
port
,
ttl
=
2
):
# XXX autodetect ip4/ip6 based on group addr
# XXX autodetect ip4/ip6 based on group addr
sk
=
socket
(
AF_INET
,
SOCK_DGRAM
,
IPPROTO_UDP
)
sk
=
socket
(
AF_INET
,
SOCK_DGRAM
,
IPPROTO_UDP
)
sk
.
setsockopt
(
SOL_SOCKET
,
SO_REUSEADDR
,
1
)
sk
.
setsockopt
(
SOL_SOCKET
,
SO_REUSEADDR
,
1
)
sk
.
bind
((
group
,
port
))
sk
.
bind
((
group
,
port
))
# join group (for rx)
mreq
=
struct
.
pack
(
"4sl"
,
inet_aton
(
group
),
INADDR_ANY
)
mreq
=
struct
.
pack
(
"4sl"
,
inet_aton
(
group
),
INADDR_ANY
)
sk
.
setsockopt
(
IPPROTO_IP
,
IP_ADD_MEMBERSHIP
,
mreq
)
sk
.
setsockopt
(
IPPROTO_IP
,
IP_ADD_MEMBERSHIP
,
mreq
)
def
_
():
# -> data
return
sk
.
recv
(
4096
)
return
_
# set ttl and default destination address (for tx)
sk
.
setsockopt
(
IPPROTO_IP
,
IP_MULTICAST_TTL
,
ttl
)
sk
.
connect
((
group
,
port
))
# receive what we send
sk
.
setsockopt
(
IPPROTO_IP
,
IP_MULTICAST_LOOP
,
1
)
return
sk
"""
# open_tx returns function to send to group:port.
# open_tx returns function to send to group:port.
def open_tx(group, port, ttl=2):
def open_tx(group, port, ttl=2):
sk = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
sk = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
...
@@ -34,37 +46,41 @@ def open_tx(group, port, ttl=2):
...
@@ -34,37 +46,41 @@ def open_tx(group, port, ttl=2):
def _(data):
def _(data):
return sk.sendto(data, (group, port))
return sk.sendto(data, (group, port))
return _
return _
"""
def
txloop
(
pkt
):
def
txloop
(
ctx
,
sk
,
pkt
):
tx
=
open_tx
(
group4
,
port
)
print
(
"txloop ..."
)
i
=
0
i
=
0
while
1
:
while
1
:
if
ctx
.
err
():
raise
ctx
.
err
()
i
+=
1
i
+=
1
pkt_
=
pkt
+
(
b'%d'
%
i
)
pkt_
=
pkt
+
(
b'%d'
%
i
)
print
(
"tx: %r ..."
%
pkt_
)
print
(
"tx: %r ..."
%
pkt_
)
tx
(
pkt
+
(
b'%d'
%
i
))
sk
.
send
(
pkt
+
(
b'%d'
%
i
))
time
.
sleep
(
1
)
time
.
sleep
(
1
)
def
rxloop
():
def
rxloop
(
ctx
,
sk
):
rx
=
open_rx
(
group4
,
port
)
print
(
"rxloop ..."
)
while
1
:
while
1
:
pkt
=
rx
()
if
ctx
.
err
():
raise
ctx
.
err
()
pkt
=
sk
.
recv
(
4096
)
print
(
"rx: %r"
%
pkt
)
print
(
"rx: %r"
%
pkt
)
def
main
():
def
main
():
sk
=
mjoin
(
group4
,
port
)
action
=
sys
.
argv
[
1
]
action
=
sys
.
argv
[
1
]
if
action
==
"tx"
:
txloop
(
sys
.
argv
[
2
])
elif
action
==
"rx"
:
rxloop
()
else
:
raise
RuntimeError
(
"Unknown action %r"
%
action
)
wg
=
sync
.
WorkGroup
(
context
.
background
())
if
"tx"
in
action
:
wg
.
go
(
txloop
,
sk
,
b
(
sys
.
argv
[
2
]))
if
"rx"
in
action
:
wg
.
go
(
rxloop
,
sk
)
wg
.
wait
()
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
main
()
main
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment