![](/img/trans.png)
[英]Get UDP packets from the same client delivered to the same server process, when using SO_REUSEPORT?
[英]2 program get same udp packets from a port
有一個服務器會向我的本地主機發送一些UDP數據包,例如:如果它向我的本地主機發送一些UDP數據包,並且目標端口是5000。並且將有一個客戶端程序在端口5000上接收它。但是,我想要什么是創建另一個程序,它將嘗試在端口5000上接收相同的數據包。
如果服務器將數據包p1,p2,p3 .... pn發送到我的本地主機端口5000,我希望兩個客戶端程序都將接收到相同的數據包。 (客戶端程序1:p1,p2,p3 .... pn,客戶端程序2:p1,p2,p3 ... pn)
我嘗試使用pcap來執行此操作,但有時似乎丟失了一些數據包。(服務器將向客戶端發送一些視頻流)
如果要在服務器進程上使用一個send
/ sendto
來執行此操作,則需要使用多播。 以下是在Python 2.7.x中完成的快速示例,以簡化/重用我編寫的代碼。
如果要將此方法與在同一主機上運行的發送器和接收器一起使用, IP_MULTICAST_LOOP
在發送端設置IP_MULTICAST_LOOP
。
sender.py:
#!/usr/bin/env python
import socket
import sys
MCAST_GROUP=sys.argv[1]
MCAST_PORT=int(sys.argv[2])
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt( socket.SOL_SOCKET, socket.IP_MULTICAST_LOOP, 1 )
for ii in xrange(10):
msg = 'message %d' %ii
print 'sending: "%s"' %msg
s.sendto( msg, (MCAST_GROUP, MCAST_PORT)
receiver.py:
#!/usr/bin/env python
import socket
import sys
import struct
MCAST_GROUP=sys.argv[1]
MCAST_PORT=int(sys.argv[2])
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
s.bind( (MCAST_GROUP, MCAST_PORT) )
# In C, you'll want to use struct ip_mreq here. See 'man 7 ip' for details.
# Python's socket module doesn't define a convenient way to do this, hence the
# 'manual' struct.pack
mreq = struct.pack( '4sI', socket.inet_aton(MCAST_GROUP), socket.INADDR_ANY )
s.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq )
while True:
rx_data = s.recv(1000)
print 'received: "%s"' %rx_data
這兩個程序都需要兩個命令行參數,一個IPv4組播IP(224.0.0.0-239.255.255.255)和一個端口。 例如( ./sender.py 239.10.10.10 5000
)。
您應該能夠在不同的終端上運行盡可能多的receiver.py
實例,並看到sender.py
的單個實例將傳輸到所有接收者。
要將其轉換為C
,基本上是:
s = socket.socket(...)
-> s = socket(...)
setsockopt
, bind
, send
, recv
}的sX(...)
轉換為X(s, ...)
ip_mreq
。 一旦在套接字上讀取/接收消息,消息就會從套接字中消失,因此即使您使用SO_REUSEADDR / SO_REUSEPORT,我也不認為您將能夠同時使用兩個客戶端讀取數據包。
我認為最簡單的選擇是在端口5000上運行本地服務,然后將所有數據包轉發到其他服務。 無論是將其編寫為服務器發布/訂閱樣式還是硬編碼,都可能要根據要為此付出多少努力來決定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.