如果我使用创建套接字
var socket = new UdpClient(0,AddressFamily.InterNetwork);
Run Code Online (Sandbox Code Playgroud)
然后我如何找到套接字的端口?
我可能很愚蠢,但我在MSDN /谷歌上没有运气(可能是因为星期五是4:42,太阳正在闪耀).
背景:
我想要做的是找到一个开放的端口,然后向另一个进程报告,以便在该端口上将消息转发给我.可能有多个客户端,所以我不想使用固定端口.
谢谢.
我有一个程序来发现网络上的客户端,负责发现的类库是.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) 我在C#中遇到了UdpClient问题.我通过互联网在两个客户端之间传输音频.
在我的麦克风上,采样率为16khz,我发送带有音频的UDP数据包,每个数据包6400字节.这些从来没有通过,除了最后的数据包,自从我关闭录音以来通常大约1200-3400的东西.当我将采样率降低到8khz时,我发送3200字节有效载荷的数据包.由于某些原因,这些总是能够通过.
所以基本上3200以上的任何东西都会变得拙劣(没有测试过确切的数字但是......)为什么这个呢?我想也许UdpClient内部缓冲区太小或什么?由于我流音频数据包被频繁发送.
接收:
private void audioReceive(IAsyncResult asyn)
{
try
{
byte[] temp = audioSock.EndReceive(asyn, ref this.serverEP);
this.waveProvider.AddSamples(temp, 0, temp.Length);
this.textbox_display.Text = this.textbox_display.Text + " got bytes: " + temp.Length;
audioSock.BeginReceive(new AsyncCallback(audioReceive), null);
}
catch (Exception ez)
{
MessageBox.Show("audioReceive: " + this.textbox_nick.Text + " " +ez.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
我找不到任何明显的错误.(该函数的asyn对象是null btw,我不需要使用stateobject,但这不应该与此相关)
我知道UDP不可靠,但考虑到每个3200大小的数据包都通过了,没有6400大小的气味给我带来腥味,特别是最大大小是64kb?
有任何想法吗?
我正在尝试了解 P2P/去中心化网络的一些来龙去脉。我的问题如下。假设我有两台名为 comp1 和 comp2 的机器。现在,comp1 设置在路由器后面的家庭网络上,comp2 也位于我办公室的路由器后面。假设端口正确转发,我是否可以像这样在 Internet 上来回发送 UDP 数据包?为了更深入地了解我正在研究的内容,我试图弄清楚新节点如何在不使用中央服务器的情况下发现现有节点。
谢谢!
我目前正在使用visual studio 2010进行测试.我创建了一个客户端和服务器,它们都将通过UdpClient连接.
我想从客户端向服务器发送一个对象.我有两种方法将对象转换为字节并将其转换为对象.现在,当我测试我的应用程序时,我无法将其转换回服务器上收到的对象
我的服务器看到该对象被接收并尝试将其从字节转换为对象,但这会产生错误.
System.Runtime.Serialization.SerializationException was unhandled Message=Unable to find assembly
Run Code Online (Sandbox Code Playgroud)
这似乎没关系,因为两个应用程序都在不同的命名空间中......
这些是我转换的方法; 在客户端和服务器上都是相同的
public byte[] ToBytes() {
using (MemoryStream stream = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, this);
stream.Position = 0;
byte[] byteRij = new byte[1024];
stream.Read(byteRij, 0, (int)stream.Length);
return byteRij;
}
}
public static Datagram ToDatagram(byte[] rij) {
using (MemoryStream stream = new MemoryStream()) {
stream.Write(rij, 0, rij.Length);
stream.Position = 0;
BinaryFormatter formatter = new BinaryFormatter();
return (Datagram)formatter.Deserialize(stream);
}
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?提前致谢
我正在尝试用打孔来实现P2P。这是流程:
我在不同的路由器上进行了测试,结果如下:
直到第四步就可以了。但在第五步中,没有对等点收到其他对等点的数据包。我预计至少* “非对称 NAT 后面的对等点”会收到其他的数据包。*
有人知道发生了什么事吗?
我有一个类的实例(我们称之为 A),它为一些线程提供服务,该实例仅通过 UdpClient 类发送 UDP 数据包。它在其构造函数中初始化 UdpClient,仅用于发送数据包。
它看起来像:
public class A{
private UdpClient m_Client;
public class A(string host, int port){
m_Client = new UdpClient(host, port);
}
public void Send(string dataToSend){
var data= encoding.GetBytes(dataToSend);
client.BeginSend(data, data.Length, null, null);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我知道 UdpClient 不是线程安全的(根据 MSDN 文档),不使用锁定机制支持多线程的最佳方法是什么?
在每次发送时创建 UdpClient 的新实例?(只需使用一些本地 UdpClient var)。表现?
对 UdpClient 使用 ThreadLocal?但是在这种情况下如何处置 UdpClient 呢?
还有其他解决方案吗?
我试图在我的 iOS7 应用程序中通过 UDP 向已知 IP 发送一个简单的字符串,但找不到有关如何执行此操作的简单解释和示例代码。有很多关于 TCP 的内容,但关于 UDP 的内容不多,在我的情况下它必须是 UDP。
我正在使用UdpClient类,.net 3.5
我需要将多个应用程序绑定到同一个端口。
因此,如果UDP服务器广播任何请求 - 在端口上侦听的所有应用程序都可以接收消息,但问题是,当我尝试将应用程序绑定到同一端口时,只有一个应用程序收到消息,而另一个应用程序没有。
下面是这两个应用程序的一些示例代码:
UdpClient udpClient = new UdpClient();
Thread thread;
IPEndPoint endPoint = new IPEndPoint(IPAddress.Loopback, 11000);
public Form1()
{
//CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
udpClient.ExclusiveAddressUse = false;
udpClient.Client.SetSocketOption(
SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(endPoint);
}
private void MainForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
thread.Abort();
udpClient.Close();
Close();
}
}
private void ReceiveMessage()
{
//while (true)
//{
// IPEndPoint remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 11000);
// byte[] content = udpClient.Receive(ref endPoint);
udpClient.BeginReceive(new AsyncCallback(Read_Callback), …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在每次收到 UDP 数据包时触发名为 receiveUDP 的函数的方法。我怎么能在 Kotlin 上做到这一点?这是我目前像简单聊天一样工作的代码。
它使用 01 editText 用于用户输入,01 textView 用于显示接收到的数据包和一个按钮来发送用户输入。
package com.e.udpchat1
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.StrictMode
import android.view.View
import android.widget.EditText
import android.widget.TextView
import java.io.IOException
import java.net.DatagramPacket
import java.net.DatagramSocket
import java.net.InetAddress
class SoftOptions {
var RemoteHost: String = "192.168.1.255"
var RemotePort: Int = 6454
constructor()
init{}
}
// Global
val Settings = SoftOptions()
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Where should I call?
// var Buffer = receiveUDP(1500)
// …Run Code Online (Sandbox Code Playgroud) udpclient ×10
c# ×6
udp ×6
networking ×3
.net ×1
android ×1
asp.net-core ×1
cfsocket ×1
ios ×1
ios7 ×1
kotlin ×1
packet ×1
tcp ×1
thread-local ×1