我正在尝试制作两个应用程序。一个将数据发送到特定的udp端口,另一个将读取它。 我有两个问题:
服务器:
private Socket sock;
private const int PORT = 5000;
public void start()
{
sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.ReceiveTimeout = 1;// seconds
sock.SendTimeout = 1;// seconds
IPEndPoint iep = new IPEndPoint(IPAddress.Any, PORT);
EndPoint ep = (EndPoint)iep;
sock.Bind(iep);
MulticastView view_obj = new MulticastView();
while(true)
{
try
{
if (sock.Connected)
{
sock.Send(Serializer.ObjectToByteArray(view_obj));
}
}catch(Exception ex){
Console.WriteLine(ex);
}
Thread.Sleep(1000); // milliseconds
}
}
客户端:
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint iep = new IPEndPoint(ip, PORT);
EndPoint ep = (EndPoint)iep;
UdpClient client = new UdpClient(PORT);
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
// or using: Byte[] receiveBytes = client.Receive(ref ep);
Byte[] receiveBytes = client.Receive(ref RemoteIpEndPoint);
MulticastView view;
view = (MulticastView)Serializer.ByteArrayToObject(receiveBytes);
请注意,我需要单独的应用程序(在单独的进程中)。任何帮助将不胜感激。
答案 0 :(得分:1)
您无法在同一IP地址/端口上打开2个独立的套接字。每个IP /端口都是一个独特的邮箱,可以这么说。 (从技术上讲,在某些情况下,可以将2个进程连接到同一个插槽,但这与您的问题无关)。规则很简单,但解决方法有几种。
我会问客户端是否真的需要一个标准的端口号。通常,UDP / TCP客户端只使用随机套接字并与服务器通信。服务器通常是连接的唯一需要标准固定端口的一面。 UdpClient.Receive()方法将使用数据包发件人的ip / port填充IPEndPoint,以便您可以回复它。
要么不要绑定到IPAddress.Any(导致它绑定到所有接口)。将Any替换为特定IP地址(如果您设置IP别名或多个适配器,则一台计算机可以有多个),或者更简单,将客户端的端口号更改为与服务器不同。您应该能够将一端绑定到主以太网接口IP地址,并将客户端绑定到环回(127.0.0.1)地址。
答案 1 :(得分:1)
尽管这是一个古老的问题,但我认为指出单端口规则的例外情况会很好。
如果使用多播(UDP为多播地址),则可以设置SO_REUSEADDR选项以将端口用于多个套接字。
答案 2 :(得分:0)
如果我的解决方案可以解决您的问题,请给我投票,
(首先,对不起我的英语不好)
长话短说,对于UDP,请使用sendasync而不是send。发送后!只是使用 socket.close(); 示例:UdpClient socket = new UdpClient(port);
IPEndPoint target = new IPEndPoint(Ipaddress,port);
socket.SendAsync(message,message.length,target);
Console.writeline("message sent");
socket.Close();
创建一个这样的类,调用该类并将您的消息放入字符串中,然后将其传递给该类。该类将使用该端口打开一个套接字,发送消息。然后关闭插座。甚至对您的网络更健康,而不是不断更改端口。为了安全?离开这里,此方法具有(0安全性)。您只需为邮件添加加密即可,仅此而已。我会飞走的... ~~~~~