Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中在计算机之间发送udp数据包#_C#_Sockets_Udp - Fatal编程技术网

C# 在C语言中在计算机之间发送udp数据包#

C# 在C语言中在计算机之间发送udp数据包#,c#,sockets,udp,C#,Sockets,Udp,我试图在本地网络中从一台计算机向另一台计算机发送udp数据包。一台计算机运行Windows 10,另一台运行Ubuntu 18.04 到目前为止,我掌握的代码如下: 服务器: using System; using System.Net.Sockets; using System.Net; namespace udpTest { class Program { static void Main(string[] args) {

我试图在本地网络中从一台计算机向另一台计算机发送udp数据包。一台计算机运行Windows 10,另一台运行Ubuntu 18.04

到目前为止,我掌握的代码如下:

服务器:

using System;
using System.Net.Sockets;
using System.Net;
namespace udpTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string hostName = Dns.GetHostName();
            string ip = Dns.GetHostEntry(hostName).AddressList[0].ToString();
            IPAddress ipadd = IPAddress.Parse(ip);
            var serverEndPoint = new IPEndPoint(ipadd, 20020);
            var udp = new UdpClient(ipadd.ToString(), 20020);
            while (true) {
                var recvData = udp.ReceiveAsync().Result;
                System.Console.WriteLine($"received: {recvData.Buffer}");
            } 
        }
    }
}
static void Main(string[] args)
        {
            
            var serverEndPoint = new IPEndPoint(IPAddress.Any, 20020);
            var udp = new UdpClient(serverEndPoint);
            while (true) {
                var recvData = udp.ReceiveAsync().Result;
                System.Console.WriteLine($"received: {recvData.Buffer}");
            } 
        }
客户:

using System;
using System.Net.Sockets;
using System.Net;
namespace C_
{
    class Program
    {
        static void Main(string[] args)
        {
            var udp = new UdpClient();
            var bytes = BitConverter.GetBytes(420);
            var i = udp.SendAsync(bytes, bytes.Length, "fe80::7077:8d67:4984:c9bc%43", 20020 ).Result;
            System.Console.WriteLine($"sent: {i}");
        }
    }
}
(我稍微更改了ipv6地址,但格式完全相同)。 我在发送时没有收到任何错误,它只是通过,但服务器没有捕捉到它。我不知道我做错了什么。因此,任何指点都将不胜感激

编辑:更新的代码在lan内工作,但在lan外不工作。 客户:

服务器:

using System;
using System.Net.Sockets;
using System.Net;
namespace udpTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string hostName = Dns.GetHostName();
            string ip = Dns.GetHostEntry(hostName).AddressList[0].ToString();
            IPAddress ipadd = IPAddress.Parse(ip);
            var serverEndPoint = new IPEndPoint(ipadd, 20020);
            var udp = new UdpClient(ipadd.ToString(), 20020);
            while (true) {
                var recvData = udp.ReceiveAsync().Result;
                System.Console.WriteLine($"received: {recvData.Buffer}");
            } 
        }
    }
}
static void Main(string[] args)
        {
            
            var serverEndPoint = new IPEndPoint(IPAddress.Any, 20020);
            var udp = new UdpClient(serverEndPoint);
            while (true) {
                var recvData = udp.ReceiveAsync().Result;
                System.Console.WriteLine($"received: {recvData.Buffer}");
            } 
        }

请首先尝试IPAddress。自使用Dns.GetHostEntry(主机名).AddressList[0].ToString()中的第一个IP地址后的任何IP地址不保证是您正在使用的IPv6地址,特别是当计算机有多个网络适配器时

第二种方法是使用为
UdpClient
构造函数创建的serverEndPoint

// Use IPAddress.Any
IPAddress ipadd = IPAddress.Any;
var serverEndPoint = new IPEndPoint(ipadd, 20020);
// Use the serverEndPoint for the UP
var udp = new UdpClient(serverEndPoint);

第三,检查服务器的防火墙设置,确保允许在端口20020上传入UDP消息(默认情况下,Windows和Ubuntu都不允许)。并检查客户端防火墙设置,确保端口20020上的传出UDP消息是允许的(默认情况下,Windows和Ubuntu都允许这样做)。

您是否尝试了
IPAddress。是否有
用于侦听?感谢您的回复。我试着做你提到的(将服务器端点设置为IPAddress.Any,检查连接是否被阻塞等),我可以获得与本地路由器IP(192.168.1.117)的连接。然而,如果我想连接路由器之间,它仍然不能做到这一点。和往常一样,我没有收到任何错误,我更新了OP中的代码。