我将首先说我试图用四个RaspBerry Pi模型B创建一个UDP多播套接字系统 . 进入每个Rpi运行一个监听脚本(我将其称为“ listen.py ”)套接字客户端 .

案例1 - 如果我直接在Rpi内部运行套接字服务器(我将其称为“ server.py ”),我完全能够发送数据报(通过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路由器正确连接):

#!/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()