UDP套接字组播

时间:2015-03-18 04:21:00

标签: java python sockets udp multicast

我首先要说的是,我不是绝对的网络专家。 我试图创建一个带有四个RaspBerry Pi模型B的UDP多播套接字系统。 进入每个Rpi正在运行一个监听脚本(我将其称为" listen.py ")套接字客户端。

案例1 - 如果我运行套接字服务器,我完全能够发送数据报(我会称之为" server.py &# 34;)直接在Rpi内部(通过SSH,我的笔记本电脑也是如此)。

我有: -listen.py启动Rpi(这里我创建一个套接字客户端); - 我运行server.py(server.py显然是进入Rpi) 在这种情况下,我从加入多播组的所有4个Rpi(224.1.1.1)

收到答案

案例2 - 我在笔记本电脑中创建了套接字服务器java和套接字客户端python,一切运行正常(代码相同,组播组相同,组播端口相同)。我试过没有使用多播只是' localhost'一切都运作良好。使用netstat,我可以看到多播组和端口。

netstat -lu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
udp        0      0 224.1.1.1:21581         *:*                                     //MulticastGroupIp:Port
udp        0      0 192.168.1.103:ntp       *:*                                     //Static ip of one Rpi
udp        0      0 *:ntp                   *:*

我的问题是如果我从我的笔记本电脑运行server.py(没有SSH)我没有来自listen.py,套接字客户端的应答,它正在运行Rpi。我绝对需要从我的笔记本电脑(我想要一个java类)发送数据报到4 Rpi。

我排除了错误代码,错误的组播IP组,错误的组播端口组的可能性。我的笔记本电脑和路由器中的防火墙也已关闭。 Rpi上的参数net.ipv4.ip_forward为1。 我知道UDP是不可靠的,但在这里我说的是丢失了100%的数据报。 我的D-Link路由器上启用了IGMP。 以太网和WiFi配置存在同样的问题。

我真的需要其他想法.....所以我试着写在这里。 对不起,这是我的第一篇文章,我是新手的一切。 我将不胜感激任何建议。 可能是我无法理解的愚蠢行为。

路由表可能有些问题????这是我的:

route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         D-Link.Home     0.0.0.0         UG    0      0        0 wlan0
192.168.1.0     *               255.255.255.0   U     0      0        0 wlan0

提前致谢

对我而言,代码运作良好,问题不存在,但如果能够更好地了解情况......

server.py 的代码(无话可说我在我的机器上安装了 Windows 7 的python):

import socket
import sys
# import time

print 'message:'
n = sys.stdin.readline()
n = n.strip('\n')

MCAST_GRP = '224.1.1.1'
MCAST_PORT = 21581

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
sock.sendto(n, (MCAST_GRP, MCAST_PORT))

或java(它正是我想要的......服务器套接字java,但目前它不是优先级):

public class PythonScriptScan {
    private static int portMulticasting = 21581;
//  private boolean broadcast = true;
    private DatagramSocket socket;
    private String groupMulticast = "224.1.1.1"; // group address 
    private int delay = 3000;

    public PythonScriptScan() {
        try {
            socket = new DatagramSocket();
        } catch (SocketException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    public void start(String agentName) {
        try {
            InetAddress group = InetAddress.getByName(groupMulticast);
            @SuppressWarnings("resource")
            MulticastSocket s = new MulticastSocket(portMulticasting);
            s.joinGroup(group);

//          while (broadcast) {
            byte[] buf = new byte[10240];
            buf = agentName.getBytes();             
            DatagramPacket packet = new DatagramPacket(buf, buf.length, group, portMulticasting);
            System.out.println(packet);
            socket.send(packet);

            // OK, I'm done talking - leave the group...
            s.leaveGroup(group);
            try {
                Thread.sleep(delay);
            } catch (InterruptedException e) {
                System.exit(0);
            }
//          }
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {
        System.out.println("Insert Message");
        @SuppressWarnings("resource")
        Scanner sc = new Scanner(System.in);
        String agentName = sc.nextLine();
        PythonScriptScan agent = new PythonScriptScan();
        agent.start(agentName);
    }

listen.py (它在每个Rpis上启动时运行,我想要的配置是以太网,每个Rpis都有一个静态IP,它们与我的D正确连接-link router):

#!/usr/bin/python
import socket
import struct
import fcntl
import subprocess
import sys
import errno
import time   
import os  

# Create the socket
MCAST_GRP = "224.1.1.1"
MCAST_PORT = 21581

try:
 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
except socket.error, msg:
 print 'Could not create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1] 

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Bind to the server address
# sock.bind(('', MCAST_PORT))
sock.bind((MCAST_GRP, MCAST_PORT))

# Tell the operating system to add the socket to the multicast group on all interfaces
mreq = struct.pack('4sl', socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

# Receive loop
try:
 while True:
  print >>sys.stderr, '\nWAITING TO RECEIVE MESSAGE'
  d = sock.recvfrom(10240)
  data = d[0]
  addr = d[1] 
  print data.strip(), addr
finally:
 print >>sys.stderr, 'closing socket'
 sock.close()

0 个答案:

没有答案