前言
最近有一个需求,需要在局域网内发现服务端的IP,于是想到了用UDP广播的方式,解决方案是服务端用python实现一个service响应客户端的udp广播,客户端用c#实现一个exe来做发现工具。
服务端:
#UDP server responds to broadcast packets
#you can have more than one instance of these running
import socket
address = ('', 10086)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
server_socket.bind(address)
while True:
print "Listening"
recv_data, addr = server_socket.recvfrom(2048)
print addr,':',recv_data
server_socket.sendto("*"+recv_data, addr)
客户端python测试代码:
#UDP client broadcasts to server(s)
import socket
address = ('<broadcast>', 10086)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
data = "Request"
client_socket.sendto(data, address)
while True:
recv_data, addr = client_socket.recvfrom(2048)
print addr,recv_data
客户端c#实现:
private UdpClient _udpcSend = null;
private UdpClient _udpcRecv = null;
private Byte[] _sendBytes = null;
private IPEndPoint _iep = new IPEndPoint(IPAddress.Broadcast, 10086);
private Thread _recvThd = null;
public void udpSend()
{
if (_udpcSend == null)
{
_udpcSend = new UdpClient();
_sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");
}
_udpcSend.Send(_sendBytes, _sendBytes.Length, _iep);
if (_recvThd == null)
{
_udpcRecv = _udpcSend;
_recvThd = new Thread(new ThreadStart(RecvThread));
_recvThd.IsBackground = true;
_recvThd.Start();
}
}
public void RecvThread()
{
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
byte[] buf = _udpcRecv.Receive(ref endpoint);
string msg = Encoding.Default.GetString(buf);
Console.WriteLine("msg:" + msg + " | addr:" + endpoint.Address);
}
}