我有一个VPN客户端,可以通过VPN管道发送单播UDP数据包,但不支持多播IP(UDP)数据包(OpenVPN).所以我想我可以编写这个带有IP(端口3000)多播的小垫片,并通过VPN作为单播发送它们.
我看到组播数据包到了,但我看不到任何东西到达VPN端(WireShark没有帮助,因为不像IpConfig/all)它没有看到VPN接口.).
我认为我的问题可能是我不清楚BIND和CONNECT之间的区别,以及我应该将UDPClient绑定到哪个接口(vpn或local).
命令行是:
239.0.0.0 198.168.0.15 10.4.30.239 172.27.225.77
arg[0] = multicast from address
arg[1] = unicast to address
arg[2] = local physical ethernet assigned address
arg[3] = virtual address of computer on VPN network (client)
Run Code Online (Sandbox Code Playgroud)
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
namespace MUTunnel
{
public class EchoBot
{
protected UdpClient sender;
protected UdpClient listener;
protected const int listenPort = 3000;
protected const int outPort = 3000;
protected IPEndPoint inPoint;
protected IPEndPoint outPoint;
protected IPAddress listenAddress;
protected …Run Code Online (Sandbox Code Playgroud) 我想做这个
for (int i = 0; i < 100; i++ )
{
Byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
}
Run Code Online (Sandbox Code Playgroud)
但UdpClient.Receive我不得不使用,而不是使用UdpClient.BeginReceive.问题是,我该怎么做?没有很多样本使用BeginReceive,MSDN示例根本没有帮助.我应该使用BeginReceive,还是只在一个单独的线程下创建它?
我一直都是ObjectDisposedException例外.我只收到第一个发送的数据.下一个数据将抛出异常.
public class UdpReceiver
{
private UdpClient _client;
public System.Net.Sockets.UdpClient Client
{
get { return _client; }
set { _client = value; }
}
private IPEndPoint _endPoint;
public System.Net.IPEndPoint EndPoint
{
get { return _endPoint; }
set { _endPoint = value; }
}
private int _packetCount;
public int PacketCount
{
get …Run Code Online (Sandbox Code Playgroud) 我正在使用c sharp创建一个客户端服务器应用程序.服务器正在使用具有固定端口号的tcplistener.客户端使用tcpclient连接到服务器.连接后,客户端和服务器都使用此连接进行通信.然后,应用程序创建新的udp连接以发送和接收消息.由于服务器假设从单个客户端接受多个连接,我必须区分每个连接与不同的端口.为了做到这一点,我得先1.服务器上创建udpclient(自动使用未使用的UDP端口的服务器).2.将服务器udpclient使用的端口号发送给客户端.3.客户端使用指定的端口号将数据发送到服务器.
问题是,如何创建一个udpclient,你可以知道使用的端口号?
在我的WPF4.0应用程序中,我有一个UDP如下所示的监听器.在我的Windows 7 PC上,我正在运行服务器和客户端localhost.
每个接收到的数据报都是较大位图的扫描线,因此在收到所有扫描线后,UI线程上会显示位图.这似乎有效.但是,偶尔会丢失一些1-50%的扫描线.我希望这在弱网络连接上,但在本地运行时不会.
UDP使用以下代码可能导致包丢失的原因是什么?
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, PORT);
udpClient = new UdpClient(endPoint);
udpClient.Client.ReceiveBufferSize = 65535; // I've tried many different sizes...
var status = new UdpStatus()
{
u = udpClient,
e = endPoint
};
udpClient.BeginReceive(new AsyncCallback(UdpCallback), status);
private void UdpCallback(IAsyncResult ar)
{
IPEndPoint endPoint = ((UdpStatus)(ar.AsyncState)).e;
UdpClient client = ((UdpStatus)(ar.AsyncState)).u;
byte[] datagram = client.EndReceive(ar, ref endPoint);
// Immediately begin listening for next packet so as to not miss …Run Code Online (Sandbox Code Playgroud) 如果我使用创建套接字
var socket = new UdpClient(0,AddressFamily.InterNetwork);
Run Code Online (Sandbox Code Playgroud)
然后我如何找到套接字的端口?
我可能很愚蠢,但我在MSDN /谷歌上没有运气(可能是因为星期五是4:42,太阳正在闪耀).
背景:
我想要做的是找到一个开放的端口,然后向另一个进程报告,以便在该端口上将消息转发给我.可能有多个客户端,所以我不想使用固定端口.
谢谢.
我知道很多次都会问过这个问题.我已经阅读了所有答案并尝试了一些我能找到的代码.几天后,我非常绝望,我不得不向你寻求帮助.
我的家庭网络中有一台设备和一台PC.设备发送UDP广播消息.在我的电脑上,我可以在wireshark中看到这些消息:
来源目的地长度
192.168.1.102 0.0.0.0 UDP 60源端口:9050目标端口:0
这意味着数据包到达我的PC.我的下一步是创建一个接收这些数据包的C#应用程序.如上所述,我尝试了所有可能的解决方案,但它不会收到任何东西.
所以我想必须有一些非常基本的我做错了.谁能帮我吗?谢谢!
我有以下代码来读取来自网络的多播消息,用于指定的IP +端口
private static void ReceiveMessages(int port, string ip, CancellationToken token)
{
Task.Factory.StartNew(() =>
{
using (var mUdpClientReceiver = new UdpClient())
{
var mReceivingEndPoint = new IPEndPoint(IPAddress.Any, port);
mUdpClientReceiver.ExclusiveAddressUse = false;
mUdpClientReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
mUdpClientReceiver.ExclusiveAddressUse = false;
mUdpClientReceiver.Client.Bind(mReceivingEndPoint);
mUdpClientReceiver.JoinMulticastGroup(IPAddress.Parse(ip), 255);
while (!token.IsCancellationRequested)
{
byte[] receive = mUdpClientReceiver.Receive(ref mReceivingEndPoint);
Console.WriteLine("Message received from {0} ",mReceivingEndPoint);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
我有两个网络适配器,我从这个多播ip +端口发送数据(由两个wireshark实例监控每个网络适配器确认).对于两个网卡,我在wireshark上看到很多流量来自那些端口+ IP).
问题是在我的控制台上,我只看到来自一个网卡的消息.
我用netstat双重检查,我的端口上没有任何其他软件监听:

那么为什么我只从我的两张网卡中获取流量呢?
编辑:
我甚至尝试了以下方法:
private static void ReceiveMessages(int port, string ip, CancellationToken token, IEnumerable<IPAddress> ipAddresses)
{
foreach (IPAddress …Run Code Online (Sandbox Code Playgroud) 我正在尝试从我的一本教科书中进行套接字编程分配.. UDP连接..
UDPServer.py
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print('The server is ready to receive:')
while 1:
message, clientAddress = serverSocket.recvfrom(2048)
modifiedMessage = message.upper()
serverSocket.sendto(modifiedMessage, clientAddress)
Run Code Online (Sandbox Code Playgroud)
UDPClient.py
from socket import *
serverName = 'localhost'
serverPort = 12000
clientSocket = socket(socket.AF_INET, socket.SOCK_DGRAM)
message = raw_input('Input lowercase sentence:')
clientSocket.sendto(message,(serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print (modifiedMessage)
clientSocket.close()
Run Code Online (Sandbox Code Playgroud)
为什么我在运行客户端时遇到此错误?
Traceback (most recent call last):
File "UDPClient.py", line 4, in <module>
clientSocket = (socket.AF_INET, socket.SOCK_DGRAM)
AttributeError: type …Run Code Online (Sandbox Code Playgroud) 以下代码尽管显然关闭了UDP套接字,但仍然无法重新连接到同一个地址/端口.
这些是我使用的类变量:
Thread t_listener;
List<string> XSensAvailablePorts;
private volatile bool stopT_listener = false;
volatile UdpClient listener;
IPEndPoint groupEP;
Run Code Online (Sandbox Code Playgroud)
我用一个处理Socket连接和监听的方法创建并启动一个新线程:
private void startSocketButton_Click(object sender, RoutedEventArgs e)
{
stopT_listener = false;
closeSocketButton.IsEnabled = true;
startSocketButton.IsEnabled = false;
t_listener = new Thread(UDPListener);
t_listener.Name = "UDPListenerThread";
t_listener.Start();
}
Run Code Online (Sandbox Code Playgroud)
该方法如下(我使用超时Receive,以便在套接字上没有发送任何内容并且正在发出时不会阻止它Stop):
private void UDPListener()
{
int numberOfPorts = XSensAvailablePorts.Count();
int currAttempt = 0;
int currPort = 0;
bool successfullAttempt = false;
while (!successfullAttempt && currAttempt < numberOfPorts)
{
try
{
currPort = Int32.Parse(XSensAvailablePorts[currAttempt]); …Run Code Online (Sandbox Code Playgroud) 我有一个程序来发现网络上的客户端,负责发现的类库是.net standard 2. 它在 Windows 机器上运行良好,但现在我需要在 linux 上运行它,而我的 UdpClient 没有收到消息,即使很困难,我确实看到它们从 linux 机器上的 tcpdump 客户端发送到正确的地址,这意味着他们确实得到了发现消息并回复它,它只是在代码中没有到达我的 UdpClient.Receive 方法。
private bool Start(IPEndPoint localEP, IPEndPoint remoteEP)
{
try
{
MulticastOption mcastOption = new MulticastOption(remoteEP.Address, localEP.Address);
List<byte> msg = new List<byte>();
// message type: Discovery
byte[] discoveryMessage = CreateDiscoveryMessage();
UdpClient managerClient = new UdpClient(localEP);
managerClient.Client.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.AddMembership,
mcastOption);
managerClient.Client.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.MulticastLoopback,
0);
Task.Run(() =>
{
while (!_token.IsCancellationRequested)
{
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0);
// Receive solicitation message
byte[] ret = managerClient.Receive(ref ep);
Console.WriteLine($"Message recieved …Run Code Online (Sandbox Code Playgroud)