当前位置:首页 » 云服务器 » udp服务器如何只发不收

udp服务器如何只发不收

发布时间: 2022-12-28 11:24:21

1. C#/VB.NET中 UDP协议连接服务器问题...运行没出错..但是收不到信息.

服务器先进行
Bind ()绑定服务器的端口
然后BeginReceive接受客户端发送的数据

客户端Bind ()绑定客户端接受和发送数据的端口
SendTo()来发送数据就可以

不需要进行BeginConnect,因为UDP不需要连接

2. 请教一个JAVA UDP程序问题。我编了一个UDP通信程序,实现客户端向服务器端发送信息。

正如你所说,UDP不需要实时连接,客户端只负责发送,不保证成功,服务端也只接收正确到达的数据包,你没有起服务端之前的客户端所发送的UDP数据包都属于丢包,就像我们玩一些网游,如果网络不好,会出现一卡一卡的,本来在这下一秒突然移动到另一个地方,中间移动的过程没有出现,这就属于丢包了。

3. 采用UDP的echo服务器示例

UDP是面向无连接的,使用起来比较简单,打开socke之后,指定目标端口,直接进行接收和发送:

socket本身提供了一些接口:

需要注意的是, boost.asio.buffer 是一种接口适配器,通过接口进行发送和接收,必须有对应的数据缓冲区提供数据或者存储空间。

同步接收同步发送的UDP服务器也比较简单,创建一个绑定到本地端口的socket,然后就是接收及发送动作:

同步操作是不需要运行IO服务的,以最常规的方式来进行发送和接收,注意接收时如果接收到全部消息,即EOF也是通过报错形式,错误码为 error::message_size 。

实现异步的UDP服务器就略显复杂,需要保证IO服务运行,发起异步操作时要注意数据缓冲区生命周期:

可以看到 do_recv 方法发起了一个异步接收操作,在操作完成回调中再次发起,构造服务器时率先调用了 do_recv ,从而保证IO服务一直运行。

do_recv 方法在发起异步操作前申请了一块内存,接收的内容被保存在这块内存之中,当 do_send 发起异步发送操作时被借用,直到发送完成才将这段内存释放掉。

在构造函数中启动了一个线程来执行IO服务,并detach掉线程,从而保证服务器不阻塞,在析构函数停止了IO服务。

需要注意到的是 remote_ep_ 在执行 do_send 时被 move 了,由于 remote_ep_ 标识了远程端口,而且被声明为成员变量,在接受操作中会被填充远程端口内容,如果多个远程主机同时发起,单个 remote_ep_ 是无法正常处理的,所以一旦内容被填充后,就会转移出去给发送操作使用[个人理解,没有实际测试和验证]。

4. udp通讯过程客户端可不可以不bind如果不bind则服务端如何向其发送信息

关键是recvfrom返回的客户端addrClient是不能作为服务器返回客户端的地址使用的,即在sendto中不能使用由recvfrom返回得到的客户端地址。 楼主将UDP通讯和TCP通讯搞混了,不过说实话这个是很正常的。当初我学的时候没一本书是把网络通信编程写清楚地,只能靠自己摸索。 socket可以理解为通信地址,它由协议,IP和端口组成。在UDP模式中,绑定的目的是要告诉操作系统,当网卡从外部接收到数据包时,操作系统就知道应该把这个数据包交给哪个应用程序。 具体是这样的,网卡总是知道自己的IP是什么,因此网卡接收到网线中的数据包时,会提取数据包的包头,里面含有的IP如果是网卡自己的IP,它就会把该数据包交给操作系统,如果不是就将该数据包丢弃,可以认为操作系统不知道有该数据包。操作系统接收到数据包后,会根据每个数据包包含的端口号,将该数据包发给不同的应用程序。操作系统怎么会知道哪个端口号对应哪个应用程序呢?这个就是要求应用程序使用bind函数,将自己的端口号告诉操作系统。因此,所谓的端口冲突就是指其他应用程序已经通过bind告诉了操作系统该端口被它使用了,因此另外的应用程序就不能使用该端口了,即bind肯定失败! 所以,bind肯定是由接受数据包的应用程序使用的,这样的应用程序就是服务器应用程序,也可以看到我们需要为bind提供IP和端口号。并且,当初我还在疑惑为什么会有一个INADDR_ANY的IP指定,似乎bind根本不需要IP啊,只要端口就可以了。仔细一想才明白,因为一台主机可能会有2个网卡。因此,主机可能会有两个IP,这样bind这个函数允许我们自由指定需要绑定到哪块网卡上的特定端口。也可以不指定,通过INADDR_ANY由操作系统为我们指定。譬如,13端口在第一块网卡中被占用了,我们就可以使用bind明确指定自己的应用程序接收来自第二块网卡13端口的数据包。 UDP编程中作为客户端发送数据时,是不需要指定自己的IP和端口的,因此无需使用bind绑定,直接在sendto指定服务器的IP和端口就可以了。但实际上发送数据时,操作系统还是需要使用客户端机器上的一个IP和端口号的,这个IP和端口号由操作系统指派,譬如在操作系统处理sendto时,它可以指派1005端口给UDP客户端,此时如果有另一个客户程序再使用bind注册该端口,就会失败了。但实际情况大家都知道,UDP数据包的发送是相当快的,这种冲突几乎不存在,因为数据包发送后,即数据包通过网卡发到了网线中,操作系统就认为发送成功了,该端口就会被操作系统收回,标记“未使用”。 总结一下,UDP服务器需要占用一个IP和一个端口号,且是固定的,是在调用了bind函数成功后便确定下来了。UDP客户端也需要使用一个IP和一个端口号,它们都是随机的,这次发送可能是第一块网卡,第二次可能是第二块网卡,端口也如此。发送后,该端口就被操作系统收回,因此客户端无法使用该端口接收来自服务器的数据包。 因此不能使用recvfrom的客户端的端口信息再调用sendto发送给客户端,因为客户端的电脑操作系统根本不会讲该数据包交给客户端应用程序。 以上用比较容易理解的概念介绍了下,其实精确说的话,很多事情不是操作系统做的,而是各种驱动程序完成的。具体怎么修改代码,楼主应该明白了吧,光改服务器端的代码,没用,客户端的代码也要改。这也是为什么UDP是不存在服务器,客户端之说的原因,因为任何一方给另一方发数据包,前提必须使另一方已经通过bind绑定了一个固定端口了。

5. 客户端使用UDP协议不停的向服务器发送数据,Java这边需要存储这些数据并进行处理,如何监控这个数据

2个方法,设置2个变量分别记载当前处理的queue下标A,(假设你的queue是结构体数组长度200),还有个表量记载还没有操作的总数B。
1.保证每个数据都接收。即时没有处理完也接收,循环加,从0-199再循环,另一个线程处理,从当前标记A开始往下处理,没处理完一个A+1 B-1,接收线程没接收一个B+1,B一直循环,QUEUE[B]接收数据,一定要注意,这2个变量和你的数组要加锁,防止2个线程同时被修改
2.保证处理,如果没处理完就不接收,加到B到上限就停止,但数据也是循环的存储,其他方法和上面一样,就是要注意加锁
以上说的方法是数据先进先出,如果想做先进后出的话,就每次处理当前A的数据,然后向前回溯就可以了

6. 如何修正安卓虚拟机收不到udp包的问题

前言
当我们做安卓开发时,大多数人还是习惯用虚拟机,毕竟真机巴拉来巴拉去的不如鼠标方便,尤其是调试一些功能模块时,比如socket udp , 下文说明如何用as+虚拟机调试 socket udp, 实测

如何搭建udp服务器和客户端不提了,简单的搭建随便找一个吧
首先我们的前提是 我们在pc上建立了一个UDP服务器,目的是通过这服务器给虚拟机发送一个udp包
但如何发送这个包呢?
如果想当然的这样做在server上给"127.0.0.1:9014"发送包,然后在虚拟机的9014端口接受包,你会发现无论发多少次,虚拟机什么都收不到。 原因是,你这个包并不是发给虚拟机了,而是发给了本地端口,
也许你会说,给虚拟机发应该用虚拟机的ip地址,好的,通过尝试我们发现给虚拟机的ip地址+9014端口,仍然无法收到。(我用工具查看的虚拟机ip地址是10.0.2.15)
正确步骤
1.把PC端口9014映射到虚拟机,意思就是当PC 9014端口收到udp包,它会转发给虚拟机相应的端口
使用windows程序telnet即可达到映射的目的,(注意Telnet在win10需要开启,可查找怎么开启这个程序)
打开cmd 输入如下命令连接到本地虚拟机
telnet localhost 5554
连接成功后他会提示你输入验证,并告诉你验证码在哪里

7. UDP 并发服务器,大家帮忙看一看!该如何解决

UDP2000个客户端左右 并发
单个数据包最大512字节
Internet 10MB带宽
要求效率(尽可能快,尽可能少丢包),这种情况下用哪种通讯模型比较有优势!
想用IOCP,因为和select模型相比,这个稍微熟悉一点,也在项目中用过,不过是TCP的。
有两个问题,大家懂得的帮忙给指导一下:
是否可以理解为UDP模式下,一次recvfrom 只对应一次sendto。
2.能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。
------解决方案--------------------------------------------------------
-------------------------------------
等不到,包被截断了。
2.能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。
--------------------------
其实,我个人认为对udp而言,不用iocp也可以满足。 首先sendto都是立即完成的,无需异步操作。而recvfrom可以只需阻塞一个线程就够了,不需要重叠操作。
------解决方案--------------------------------------------------------
用UDX协议最可靠,效率高,开发简单,非开源。
UDT开源,对于你这种2000客户,够用,开源。
------解决方案--------------------------------------------------------
1.sendto 10k,接受部分要么收到10k,要么全部丢失,不会出现部分收到的情况。
------解决方案--------------------------------------------------------
-------------------------------------
在局域网可以,公网,一般1K也收不到。
2.能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。
--------------------------完全可以
------解决方案--------------------------------------------------------
1.如果UDP数据在传输过程中被分包,则你需要对数据包进行标识,已确保获取的包完整。一次recvfrom并不对应一次sendto,考虑UDP不可靠传输的因素。
2.不可以,因为sendto和recvfrom都是对同一个资源Socket进行操作。如果在多个线程中对同一个资源进行操作,如果不加锁的情况下,会非常可怕的。而且,如果你加锁了,其实还不如单线程操作。
按照你的需求最好还是采用UDP,不过可以考虑组播。
2.API调用完全没有问题。但是接到的数据可能和发送的数据次序不一样,这本身是UDP乱序特性决定了的。而且你发送方可能是多线程,从API层面来说,这些调用都是可以的,完全没有问题。但是给你接收方处理带来一系列问题。

8. UDP类型的服务器和客户端,只能是客户端最先发送数据

UDP没有 客户端 和服务器的区分,随便那个先发都可以。
不同的机器发过来也行。只要发到相应的ip 和端口就行了。
因为UDP和TCP不同,UDP是不需要首先建立连接的。

热点内容
极光大数据库 发布:2025-03-15 10:11:48 浏览:582
智e付忘了登录密码在哪里修改 发布:2025-03-15 10:05:20 浏览:650
手机热点密码忘了怎么办 发布:2025-03-15 09:28:26 浏览:363
缓解压力锻炼方法 发布:2025-03-15 09:23:01 浏览:426
impdp存储过程 发布:2025-03-15 09:20:05 浏览:741
pythoniris 发布:2025-03-15 09:05:27 浏览:190
浪淘沙服务器怎么没有了 发布:2025-03-15 09:05:26 浏览:100
ftprpm安装包下载 发布:2025-03-15 09:03:53 浏览:723
如何判断背包配置 发布:2025-03-15 09:03:00 浏览:900
淘宝api源码 发布:2025-03-15 09:00:00 浏览:160