我通过常见的异步回调从UdpClient接收数据:
private void OnUdpData(IAsyncResult result)
{
byte[] data = _udpReceive.EndReceive(result, ref _receiveEndPoint);
//Snip doing stuff with data
_udpReceive.BeginReceive(OnUdpData, null);
}
Run Code Online (Sandbox Code Playgroud)
当我Close()在主线程中的UdpClient时,回调会像我期望的那样触发,但是此时_udpReceive已经处理掉了,ObjectDisposedException当我尝试呼叫时我得到了一个EndReceive().我本来希望得到一个空的缓冲区.
处理这个问题的正确方法是什么?UdpClient在尝试使用它之前是否有一些我可以检查的成员,或者它是唯一的方法将它包装在一起try{}并捕获ObjectDisposedException?对于正常的关闭来说,这看起来非常糟糕.
我试图从Windows XP上的UdpClient发送UDP数据报到设备,但它没有响应.当我在Wireshark中查看该流量时,我发现我的出站数据包很糟糕,因为它们的所有IP头校验和都是0x0000.
这台机器有两个网卡,所以我开始使用另一个网卡,并开始遇到同样的问题.
我可以用两个网卡ping我的设备,所以我认为必须有一些我的C#代码做错了,但我不确定是什么.在Windows XP上使用UdpClient导致这种情况有什么问题吗?
我在网上找不到这个,所以我想我会问这里.
目前websockets可以使用哪些协议?(镀铬)
chrome或任何其他浏览器计划最终还支持用于websockets的RUDP协议吗?
提前致谢!
我正在制作一个连接到桌面应用程序的Win RT应用程序,他们开始用UDP和TCP进行通信.
我已成功实现TCP通信,因为我可以从Win RT发送到桌面并从桌面发送到Win RT.在Win RT上使用StreamSocket,在桌面上使用TcpListener.
我还让它将Win RT中的Udp数据发送到桌面而没有任何问题.但我无法接收从桌面发送到Win RT的数据.我使用以下代码,我没有看到任何问题,但必须有一些东西.
var g = new DatagramSocket();
g.MessageReceived += g_MessageReceived;
g.BindEndpointAsync(new HostName("127.0.0.1"), "6700");
.
.
.
void g_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{ // <- break point here.
}
Run Code Online (Sandbox Code Playgroud)
该断点永远不会停止代码,这意味着它永远不会得到消息.我只能想到IBuffer,因为在我的StreamSocket上我应该通过reader.GetBuffers()获取字节,而不是reader.GetBytes().然而,这是我需要在Win RT而不是桌面上考虑的事情.因为在Tcp上我只发送字节,我在Win RT中得到缓冲区,所以DatagramSocket也应该这样做.
感谢你们.
所以我试图制作一个非常简单的系统来从客户端向服务器发送消息(稍后也从服务器到客户端,但首先是婴儿步骤)。我不确定如何使用 UDPClient 发送和接收消息(尤其是接收消息),主要是因为我没有任何东西可以触发该ReceiveMessage()功能,而且我不确定会发生什么。
源代码位于此链接,转到文件>下载。如果您只想运行 exe,它已经构建好了。
所以我的问题基本上是:我怎样才能轻松使用UDPClient,我怎样才能让这个系统工作,以及执行这种连接有哪些技巧?我应该注意什么(线程、代码问题等)?
来源。
我有两个类,一个是发送者类,另一个是接收者类。发送和接收应用程序都会在几秒钟后停止并关闭。我的发件人类别是:
public class MainActivity extends Activity {
InetAddress receiverAddress;
DatagramSocket datagramSocket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
datagramSocket = new DatagramSocket(4444);
} catch (SocketException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
byte[] buffer = "0123456789".getBytes();
byte[] address="192.168.1.101".getBytes();
try {
receiverAddress = InetAddress.getByAddress(address);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
DatagramPacket packet = new DatagramPacket(
buffer, buffer.length, receiverAddress, 4444);
try {
datagramSocket.send(packet);
} catch (IOException e) {
// TODO Auto-generated …Run Code Online (Sandbox Code Playgroud) 我想了解我的UdpClient收到数据时是否可以通过某种方式触发事件?(System.Net.Sockets.UdpClient)
我尝试覆盖它的UdpClient.Receive,但是我不能按照此方法进行,因为可覆盖成员必须标记为虚拟或抽象。
我目前的方式是在特定时间间隔上在Threading.Timer上运行TimerCallback来获取我的数据,但我更希望在数据到达时接收传入数据,而不是重复获取数据。
关于如何执行此操作或需要定期手动接收的任何建议,建议或指示?
提前致谢。
import logging
import graypy
my_logger = logging.getLogger('test_logger')
my_logger.setLevel(logging.DEBUG)
handler = graypy.GELFHandler('my_graylog_server', 12201)
my_logger.addHandler(handler)
my_adapter = logging.LoggerAdapter(logging.getLogger('test_logger'),
{ 'username': 'John' })
my_adapter.debug('Hello Graylog2 from John.')
Run Code Online (Sandbox Code Playgroud)
不管用
我认为问题是应该发送到的URL,/gelf
因为当我从终端卷曲到我的graylog服务器时,它可以工作
curl -XPOST http://my_graylog_server:12201/gelf -p0 -d '{"short_message":"Hello there", "host":"example1111.org", "facility":"test", "_foo":"bar"}'
Run Code Online (Sandbox Code Playgroud) 再会。我和UdpClient它一起工作并有包装。
为了阅读,我有异步方法:
\n\nprivate async Task<byte[]> Receive(UdpClient client, CancellationToken breakToken)\n{\n // \xd0\x92\xd1\x8b\xd1\x85\xd0\xbe\xd0\xb4 \xd0\xb8\xd0\xb7 async, \xd0\xb5\xd1\x81\xd0\xbb\xd0\xb8 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb8\xd0\xb7\xd0\xbe\xd1\x88\xd1\x91\xd0\xbb CancellationRequest\n breakToken.ThrowIfCancellationRequested();\n\n UdpReceiveResult result;\n try\n {\n result = await client.ReceiveAsync().WithCancellation(breakToken);\n }\n catch(OperationCanceledException)\n {\n // \xd0\xa8\xd1\x82\xd0\xb0\xd1\x82\xd0\xbd\xd0\xb0\xd1\x8f \xd1\x81\xd0\xb8\xd1\x82\xd1\x83\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f \xd1\x80\xd1\x83\xd1\x87\xd0\xbd\xd0\xbe\xd0\xb9 \xd0\xbe\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xba\xd0\xb8 Task-\xd0\xb0\n }\n\n return result.Buffer;\n}\nRun Code Online (Sandbox Code Playgroud)\n\nWithCancellation我提前终止的扩展方法在哪里:
public static async Task<T> WithCancellation<T>(\n this Task<T> task, CancellationToken cancellationToken)\n{\n var tcs = new TaskCompletionSource<bool>();\n\n using (cancellationToken.Register(\n s => ((TaskCompletionSource<bool>)s).TrySetResult(true),\n tcs))\n if (task != await Task.WhenAny(task, tcs.Task))\n throw new OperationCanceledException(cancellationToken);\n\n return await task;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n手动读取停止后,当我打电话时 …
以下代码使用 Task 异步接收并在控制台中显示接收到的结果:
private void ReceiveMessage()
{
Task.Run(async() =>
{
using(var udpClient = new UdpClient(15000))
{
while(true)
{
var receivedResult = await udpClient.ReceiveAsync();
Console.Write(Encoding.ASCII.GetString(receivedResult.Buffer));
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
我想学习如何使用 async/await 函数,所以我想知道如何使用 async/await 使函数 ReceiveMessage() 异步?