簡體   English   中英

2程序從端口獲取相同的udp數據包

[英]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 ,基本上是:

  1. 轉換s = socket.socket(...) -> s = socket(...)
  2. 將X = { setsockoptbindsendrecv }的sX(...)轉換為X(s, ...)
  3. 請參閱有關ip_mreq

一旦在套接字上讀取/接收消息,消息就會從套接字中消失,因此即使您使用SO_REUSEADDR / SO_REUSEPORT,我也不認為您將能夠同時使用兩個客戶端讀取數據包。

我認為最簡單的選擇是在端口5000上運行本地服務,然后將所有數據包轉發到其他服務。 無論是將其編寫為服務器發布/訂閱樣式還是硬編碼,都可能要根據要為此付出多少努力來決定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM