我首先要说的是,我不是绝对的网络专家。 我试图创建一个带有四个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()