我知道该协议不支持这一点,但对于需要一定程度可靠性的客户端来说,如果发现它是腐败的,请求重新发送数据包的方法是否常见?
我有3个不同的网卡,每个网卡都有自己的责任.其中两个卡正在从类似设备(直接插入每个单独的网卡)接收数据包,该设备在同一端口上发送数据.我需要知道他们来自哪个设备的数据包.
鉴于我不需要指定发送数据包的设备的IP地址,我该如何监听给定的网卡?如果需要,我可以为所有3个nics指定静态IP地址.
示例:nic1 = 169.254.0.27,nic2 = 169.254.0.28,nic3 = 169.254.0.29
现在我有这个从nic1和nic2接收数据而不知道它来自哪个设备.
var myClient = new UdpClient(2000) //Port is random example
var endPoint = new IPEndPoint(IPAddress.Any, 0):
while (!finished)
{
byte[] receivedBytes = myClient.Receive(ref endPoint);
doStuff(receivedBytes);
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法以允许我从其中一个设备捕获数据包的方式指定网卡的静态IP地址.如何才能将这些数据包与他们在两个不同网卡上传入的知识分开?
谢谢.
我正在研究可以通过UDP套接字进行通信的服务器/客户端php脚本.我想知道是否有一种很好的方法来实现socket_recv()函数的timeout().目前它在我的客户端阻塞,等待确认.
感谢您的输入!
我想通过LAN广播字符串,但是当我将客户端代码中的服务器IP更改为255.255.255.255时,它不会广播.如何通过LAN广播字符串?我应该在客户端代码中做什么,以便不同IP的所有侦听端口可以同时接收字符串.
我的客户端或发送字符串的代码是:
public class MainActivity extends Activity {
private Socket socket;
private static final int SERVERPORT = 6000;
private static final String SERVER_IP = "192.168.1.10";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new ClientThread()).start();
}
public void onClick(View view) {
try {
EditText et = (EditText) findViewById(R.id.EditText01);
String str = et.getText().toString();
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
out.println(str);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) { …Run Code Online (Sandbox Code Playgroud) 我有一个不同类型对象的数组,我使用BinaryWriter将每个项目转换为二进制等价物,以便我可以通过网络发送结构.
我现在做的事情就像
for ( i=0;i<tmpArrayList.Count;i++)
{
object x=tmpArrayList[i];
if (x.GetType() == typeof(byte))
{
wrt.Write((byte)x);
}
........
Run Code Online (Sandbox Code Playgroud)
问题是,如果错过了一个类型,我的代码将来可能会破坏.
我想做点什么.
object x=tmpArrayList[i];
wrt.Write(x);
Run Code Online (Sandbox Code Playgroud)
但除非我每次演员,否则它不起作用.
编辑:
在查阅答案之后,这就是我想出的功能.为了测试,该函数将数组发送到syslog.
private void TxMsg(ArrayList TxArray,IPAddress ipaddress)
{
Byte[] txbuf=new Byte[0];
int sz=0;
// caculate size of txbuf
foreach (Object o in TxArray)
{
if ( o is String )
{
sz+=((String)(o)).Length;
}
else if ( o is Byte[] )
{
sz+=((Byte[])(o)).Length;
}
else if ( o is Char[] )
{
sz+=((Char[])(o)).Length;
}
else // take care of …Run Code Online (Sandbox Code Playgroud) 我一直在用C#试验UDP发送和接收,并且有一个奇怪的问题.代码在控制台应用程序中工作正常,但当我尝试在服务中使用完全相同的代码时,client.ceceive方法被阻止.服务正常运行,不会中止,我有记录写入文本文件,所以我知道它到达接收.有人有主意吗?代码如下......
public partial class Service1 : ServiceBase
{
private bool serviceStarted = false;
Thread listenerThread;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
serviceStarted = false;
WriteLog("UDPListener Service Starting");
ThreadStart thread = new ThreadStart(StartListening);
listenerThread = new Thread(thread);
serviceStarted = true;
listenerThread.Start();
}
protected override void OnStop()
{
WriteLog("UDPListener Service Stopping");
serviceStarted = false;
listenerThread.Join(new TimeSpan(0, 0, 5));
}
private void StartListening()
{
WriteLog("Worker thread spawned.");
UdpClient client = new UdpClient(40000);
while (serviceStarted)
{
WriteLog("Service is started. …Run Code Online (Sandbox Code Playgroud) 我想用C#的UdpClient来监听任何收到的UDP数据包.我想从任何IP和任何端口接收数据包.
我尝试了以下方法:
UdpClient udpClient = new UdpClient(0);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0);
byte[] data = udpClient.Receive(ref ep);
Run Code Online (Sandbox Code Playgroud)
但没有成功.
有谁知道什么是错的?提前致谢!
我从二进制文件中查看了UDP客户端程序,我能够将一个UDP数据包发送到UDP服务器,这是我的嵌入式设备,该设备回送UDP消息.
在这个PC-UDP客户端代码中,它应该得到回显的消息,但我没有得到任何回声.所以我在我的PC上运行一个UDP服务器,它监听传入的数据并打印它,我能够看到来自我的嵌入式设备的回显消息.
当我在代码中的while(1)循环之前添加这些行时,现在我能够看到Echoed返回消息.
//setup address structure
memset((char *) &si_server, 0, sizeof(si_server));
si_server.sin_family = AF_INET;
si_server.sin_port = htons(PORT);
si_server.sin_addr.S_un.S_addr = INADDR_ANY;
if( bind(s ,(struct sockaddr *)&si_server , sizeof(si_server)) == SOCKET_ERROR)
{
printf("Bind failed with error code : %d" , WSAGetLastError());
exit(EXIT_FAILURE);
}
puts("Bind done");
Run Code Online (Sandbox Code Playgroud)
有关可能导致问题的原因的任何想法?
我正在开发SNTP客户端,它通过UDP从NTP服务器获取时间戳.一切正常,我可以下载时间戳和更新Windows时钟,但如果UDP数据包丢失,我想收到一条消息.如何检测数据包何时丢失?我需要这些信息,因为如果数据丢失,我想获得新的时间戳.
......我该如何测试该功能?如何故意丢失UDP数据包?
我正在使用.NET 4.5.1运行C#控制台应用程序.当我运行以下函数时,下面的udpClient.ReceiveAsync()调用默默地终止程序,没有异常.我该如何调试?
public async void Run()
{
try
{
var armIpAddress = IPAddress.Parse("239.1.11.1");
using (var udpClient = new UdpClient())
{
udpClient.ExclusiveAddressUse = false;
var ipEndPoint = new IPEndPoint(IPAddress.Any, 12020);
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.ExclusiveAddressUse = false;
udpClient.Client.Bind(ipEndPoint);
udpClient.JoinMulticastGroup(armIpAddress);
while (true)
{
var result = await udpClient.ReceiveAsync();
//...
}
}
catch (Exception x)
{
Console.WriteLine(x.Message);
}
}
Run Code Online (Sandbox Code Playgroud) 我通过多个路由器将 1 MB 的 UDP 数据从一个系统发送到另一个系统。两个系统都有 1500 MTU,在两台主机之间,我有一个 MTU 较低的路由器,如 576。
那么路由器(具有较低的 MTU (576))是将 UDP 数据包分段并发送到接收主机还是将ICMP 消息(PMTU)发送到发送主机以进行进一步分段?
谢谢您的帮助.
我正在将旧版本的Delphi转换为XE5,而我正困在Indy组件中.需要使用IdUDPClient.ReceiveBuffer
这是我的代码:
while not Terminated do
begin
try
lenUDP:= IdUDPClient.ReceiveBuffer(myBuf, buffLength, -1 );
if lenUDP<> 0 then
Synchronize(ReceivedLine);
except
Terminate;
end;
end;
Run Code Online (Sandbox Code Playgroud)
其中,myBuf = char数组[0 .. buffLength -1];
非常感谢所有帮助.
谢谢,
麦克风