Tag: udp

从UDP套接字接收并发回数据

我正在尝试编写一个接受请求的控制台应用程序(大小为18个字节),然后将一些东西(大小为7个字节)发送回客户端。 我为我的生活似乎无法让这个工作。 我可以很好地接收数据,但我发回的数据永远不会到达客户端。 这是我的代码 static void Main(string[] args) { // Data to return byte[] ret = { 0xfe, 0xfd, 0x09, 0x00, 0x00, 0x00, 0x00 }; // tell the user that we are waiting Console.WriteLine(“Waiting for UDP Connection…”); // Create a new socket to listen from Socket Skt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); Skt.EnableBroadcast = true; […]

从UdpClient收到的UDP包中获取客户端IP

我正在System.Net.Sockets.UdpClient类的帮助下开发一个动作多人游戏。 它适用于两个玩家,因此应该打开服务器并等待传入​​的连接。 另一个玩家输入主机IP并尝试发送“ping”,以确保可以连接并且有一个打开的服务器。 主持人然后用“乒乓球”回应。 一旦游戏运行,两者都必须向对方发送udp消息,因此他们都需要对手的ip地址。 当然服务器也可以输入客户端IP,但这对我来说似乎是不必要的。 当收到“ping”消息时,如何从udp包中获取客户端IP? 这是我的接收代码(等待ping的服务器): private void ListenForPing() { while (!closeEverything) { var deserializer = new ASCIIEncoding(); IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0); byte[] recData = udp.Receive(ref anyIP); string ping = deserializer.GetString(recData); if (ping == “ping”) { Console.WriteLine(“Ping received.”); InvokePingReceiveEvent(); } } }

udp数据包没有通过

我有以下设置: 专用服务器 – >互联网 – >调制解调器(telenet) – >路由器 – >客户端 客户端启动与服务器的tcp连接以在服务器上注册自己,并通过以下信息提供: 客户端的mac地址 外部IP; 这是通过使用whatsmyip.org的webclient字符串下载来检索的 服务器上发生了一些更新,当然需要通知客户端,因此客户端可以自己启动同步会话: 为了通知客户端,服务器从服务器向调制解调器发送udp数据包(之前从客户端收到的外部IP) ,同时客户端正在侦听路由器后面的udp数据包。 问题是我没有收到任何数据包..我的情况是否可能,我该怎么办? 要求: 通过在路由器上启用端口转发来解决此问题不是一种选择 服务器有一个固定的IP 客户端有时可能会脱离Internet 解决方案必须适用于不同类型的路由器 发送和接收数据包的两个端口都是相同的 所有编程都在C#中完成 服务器在有更新时通知客户端,客户端可能永远不会轮询服务器以获取更新以防止过载(如果多个客户端同时执行此操作) Greets Daan并提前感谢 编辑: 服务器的代码示例: UdpClient udpSender = new UdpClient(); IPEndPoint localServerGateway = new IPEndPoint(IPAddress.Parse(externalIp), 8003); string message = “testmessage”; byte[] messageBytes = Encoding.ASCII.GetBytes(message); try { udpSender.Send(messageBytes, messageBytes.Length, localServerGateway); } […]

定时器C#。 启动,停止并获取通话之间的时间

可能重复: 如何测量函数运行多长时间? 我正在编写一个带有可靠数据传输的UDP聊天。 我需要在发送数据包时启动计时器,并在收到服务器的答复后立即停止(确认 – 确认)。 这是我的代码: private void sendButton_Click(object sender, EventArgs e) { Packet snd = new Packet(ack, textBox1.Text.Trim()); textBox1.Text = string.Empty; Smsg = snd.GetDataStream();//convert message into array of bytes to send. while (true) { try { // Here I need to Start a timer! clientSock.SendTo(Smsg, servEP); clientSock.ReceiveFrom(Rmsg, ref servEP); //Here I need to […]

WAN上的TCP和UDP套接字服务器

我正在尝试创建一个兼容TCP和UDP的服务器和客户端。 服务器在LAN设置中运行良好,但在WAN上传输时不会收到UDP消息。 我相信这是因为用于发送数据的UDP套接字不会在NAT表中保留足够长的时间来返回任何信息。 有没有办法让UDP端口在路由器中保持打开状态(没有端口转发)或者使用与已连接的TCP连接相同的UDP端口? 提前致谢。

Tcp可靠性与Udp负载对于认真,高性能的服务器

速度,优化和可扩展性是Udp和Tcp协议之间的典型比较。 Tcp吹嘘可靠性有一点额外开销的缺点,但速度很好,非常好。 一旦Tcp套接字被实例化,保持套接字打开需要一些开销。 但与Udp所描述的负担相比,哪种协议实际上有更多的开销? 我也听说过Tcp存在可扩展性问题……但是互联网(网页/服务器)在Tcp上运行 – 那么Tcp是什么阻碍了可扩展性呢? 好的…所以Udp不需要保持连接打开的开销。 但是,它要求您编写额外的方法以确保所有数据包都到达那里,希望按照您希望它接收的顺序。 如果未完整收到数据包,则必须告知客户端或服务器重新发送。 此外,您还必须为部分数据包保留某种消息收集,重建部分消息,并在最终处理消息之前检查完整的消息。 更不用说如果消息的第二部分永远不会成功,你必须要么重新发送整个事物,要么重新发送我们缺少的部分,或者其他什么。 基本上,我的问题是: 为什么我会选择Udp over Tcp来获得一个严肃的高性能服务器,它增加了消息检查和手动ACK的“开销”与连续流的“开销”? 如果Tcp对于魔兽世界来说足够好,为什么Tcp不被广泛接受作为游戏服务器使用的协议? 注意:我不反对为服务器实现Udp选项。 我们在.Net 3.5框架上使用C#。 因此,我也对处理Udp 负担的最佳实践感兴趣。 我也在套接字级别使用异步方法,而不是使用TcpListener,TcpClient等。

从C#发送FINS命令到PLC

我尝试通过UDP从PC(C#.NET)发送FINS命令到PLC以太网模块(Omron),但是没有从PLC得到任何响应,并且不知道我可以在哪里开始故障排除。 PLC具有非常简单的梯形逻辑如下:如果DM100值为#0001 ,则在输出101.00上触发。 (这里,“触发器”只是存储区域D100的符号名称,“输出”是输出的符号101.00 ) 然后我写了一段C#执行FINS命令“Memory Area Write”,其命令代码为01 02 ,后跟起始地址,要写入的项目数和数据。 C#代码应将# 0001的值写入PLC的D100区域,以便在101.00上触发ON。 [删除不起作用的代码] .. 输出101.00没有被触发,也没有收到任何exception。 我确定了以下内容: 正确配置的端口,节点和地址由CX-Programmer中的“在线工作”确认。 我还ping每个IP以确保节点已连接。 UdpClient代码是有效的,因为我写了一个非常简单的服务器/客户端代码,成功发送和接收数据包。 梯形逻辑没有问题。 我将梯子转移到PLC并在监控模式下通过在线测试并手动设置D100值。 我怀疑fins_cmnd数组中有错误,但正如我的代码中所见,我已经对每个值进行了详细评论; 我不可能发现自己错过任何东西。 我怀疑我可能没有正确解析hex,但同样,我也没有例外来指导我。 我不知道在哪里以及如何排除故障。 希望有人在这里使用FINS编程或PLC经验可以为我提供一些帮助。 [回答] 感谢Porge的链接 – 这让我发现了问题所在。 经过几个小道后终于开始工作了。 请参阅下面的工作代码。 string SERV_IP_ADDR = “192.168.250.1”; const int FINS_UDP_PORT = 9600; byte[] sendPacket = new byte[] { // Full UDP packet: 80 00 02 00 […]

C#UDP套接字:获取接收者地址

我有一个异步UDP服务器类,其中一个套接字绑定在IPAddress.Any上,我想知道收到的数据包被发送到哪个IPAddress(…或收到)。 似乎我不能只使用Socket.LocalEndPoint属性,因为它总是返回0.0.0.0(这是有意义的,因为它绑定到…)。 以下是我目前使用的代码的有趣部分: private Socket udpSock; private byte[] buffer; public void Starter(){ //Setup the socket and message buffer udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); udpSock.Bind(new IPEndPoint(IPAddress.Any, 12345)); buffer = new byte[1024]; //Start listening for a new message. EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0); udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock); } private void DoReceiveFrom(IAsyncResult […]

如何在C#中创建UDP服务器?

可能重复: C#如何制作简单的UDP服务器 我想在C#中创建一个UDP服务器。 我怎么做? 如何自定义它侦听的端口(即1212)?

通过套接字最简单的广告/听力安排

以下简单安排有什么问题。 我所做的就是创建一个多播消息的UDP广告商,以及一个加入多播组以接收此消息的侦听器,两者都在同一台机器上运行。 string Port = “54153”; HostName Host = new HostName(“224.3.0.5”); //a multicast range address //listener var L = new DatagramSocket(); L.MessageReceived += (sender2, args) => { /*something*/ }; await L.BindServiceNameAsync(Port); L.JoinMulticastGroup(Host); //advertiser var AdvertiserSocket = new DatagramSocket(); AdvertiserSocket.Control.MulticastOnly = true; Stream outStream = (await AdvertiserSocket.GetOutputStreamAsync(Host, Port)).AsStreamForWrite(); using (var writer = new StreamWriter(outStream)) { await […]