单个数据包最大512字节
Internet 10MB带宽
要求效率(尽可能快,尽可能少丢包),这种情况下用哪种通讯模型比较有优势!
想用IOCP,因为和select模型相比,这个稍微熟悉一点,也在项目中用过,不过是TCP的。
有两个问题,大家懂得的帮忙给指导一下:
是否可以理解为UDP模式下,一次recvfrom 只对应一次sendto。
2能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。
------解决方案--------------------------------------------------------
-------------------------------------
等不到,包被截断了。
2能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。
--------------------------
其实,我个人认为对udp而言,不用iocp也可以满足。 首先sendto都是立即完成的,无需异步 *** 作。而recvfrom可以只需阻塞一个线程就够了,不需要重叠 *** 作。
------解决方案--------------------------------------------------------
用UDX协议最可靠,效率高,开发简单,非开源。
UDT开源,对于你这种2000客户,够用,开源。
------解决方案--------------------------------------------------------
1sendto 10k,接受部分要么收到10k,要么全部丢失,不会出现部分收到的情况。
------解决方案--------------------------------------------------------
-------------------------------------
在局域网可以,公网,一般1K也收不到。
2能否对服务端的套接字同时投递多个WsaRecvFrom,能否在多个线程中同时投递WsaSendTo和WsaRecvFrom。
--------------------------完全可以
------解决方案--------------------------------------------------------
1如果UDP数据在传输过程中被分包,则你需要对数据包进行标识,已确保获取的包完整。一次recvfrom并不对应一次sendto,考虑UDP不可靠传输的因素。
2不可以,因为sendto和recvfrom都是对同一个资源Socket进行 *** 作。如果在多个线程中对同一个资源进行 *** 作,如果不加锁的情况下,会非常可怕的。而且,如果你加锁了,其实还不如单线程 *** 作。
按照你的需求最好还是采用UDP,不过可以考虑组播。
2API调用完全没有问题。但是接到的数据可能和发送的数据次序不一样,这本身是UDP乱序特性决定了的。而且你发送方可能是多线程,从API层面来说,这些调用都是可以的,完全没有问题。但是给你接收方处理带来一系列问题。UDP的意思是什么 UDP与TCP的区别
udp的意思: 是User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。它是IETF RFC 768是UDP的正式规范。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。
词性 :abbr 用户数据报协议(=User Datagram Protocol)
Uliana Uonuki Ulisso Uzhviy Uliger Uborka Uzurov ugt UGPase uberty
udp的作用:
为了在给定的主机上能识别多个目的地址,同时允许多个应用程序在同一台主机上工作并能独立地进行数据包的发送和接收,设计 用户数据报协议UDP。
使用UDP协议包括: TFTP、 SNMP、NFS、DNS、BOOTP。
UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提供报文到达确认、排序、及流量控制等功能。
UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping” *** 作发送4个数据包(如图2所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。
UDP与TCP的区别:
1TCP是面向连接的运输层协议,UDP是无连接的。
2每一条TCP连接只能有两个端点,UDP支持一对一、一对多、多对一和多对多的通信。
3TCP提供可靠交付的服务,UDP使用尽最大努力交付。
4TCP面向字节流,UDP面向报文。
5TCP有拥塞控制,UDP没有拥塞控制。
6TCP首部开销较大最少20个字节,UDP首部开销较小只有8个字节。
TCP与UDP基本区别
1基于连接与无连接
2TCP要求系统资源较多,UDP较少;
3UDP程序结构较简单
4流模式(TCP)与数据报模式(UDP);
5TCP保证数据正确性,UDP可能丢包
6TCP保证数据顺序,UDP不保证
UDP应用场景:
1面向数据报方式
2网络数据大多为短消息
3拥有大量Client
4对数据安全性无特殊要求
5网络负担非常重,但对响应速度要求高
具体编程时的区别
1socket()的参数不同
2UDP Server不需要调用listen和accept
3UDP收发数据用sendto/recvfrom函数
4TCP:地址信息在connect/accept时确定
5UDP:在sendto/recvfrom函数中每次均 需指定地址信息
6UDP:shutdown函数无效
编程区别
通常我们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),这表示建立一个socket用于流式网络通讯。
SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。
而SOCK_DGRAM这种是User Datagram Protocol协议的网络通讯,它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何一方建立一个socket以后就可以用sendto发送数据,也可以用recvfrom接收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度比较快。大家都知道TCP是要经过三次握手的,而UDP没有。
基于上述不同,UDP和TCP编程步骤也有些不同,如下:
TCP:
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); 可选
3、绑定IP地址、端口等信息到socket上,用函数bind(); 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
UDP:
与之对应的UDP编程步骤要简单许多,分别如下:
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); 可选
3、绑定IP地址、端口等信息到socket上,用函数bind(); 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。
UDP补充:
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDO也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交给由采用UDO的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。、
传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的运输层通信协议,通常由IETF的RFC 793说明。在简化的计算机网络OSI模型中,它完成运输层所指定的功能。
与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。
UDP 适用于不需要 TCP 可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。 UDP 是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)。
TCP补充:
TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。
TCP与UDP区别总结:
1UDP速度比TCP快
2UDP有消息边界
3UDP可以一对多传输
4UDP可靠性不如TCP
5UDP不像TCP那样能保证有序传输
UDP速度比TCP快
由于UDP不需要先与对方建立连接,也不需要传输确认,因此其数据传输速度比TCP快得多。
UDP有消息边界
使用UDP不需要考虑消息边界问题,使用上比TCP简单
UDP可以一对多传输
利用UDP可以使用广播或组播的方式同时向子网上的所有客户发送信息。这一点也比TCP方便。
UDP可靠性不如TCP
与TCP不同,UDP并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP称为不可靠的传输协议。
UDP不像TCP那样能保证有序传输
UDP不能确保数据的发送和接收顺序。对于突发性的数据报,有可能会乱序。事实上,UDP的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才有可能发生。
解决办法:1,修复IE,2,查看启动项,3,杀毒,可以用黄山IE修复专家修复一下,去华军软件园后面网址下载就行。>对第一个问题,你可以这样:做一个while(true)循环,循环内UdpClient 在不停Receive ,接收到 byte[] ReceivedByte 以后,马上建立一个线程去处理接收到的数据,你进入处理ReceivedByte 的线程时,不要直接对ReceivedByte 处理,复制一份过去,这里是继续Receive 的,至于你有几种格式什么的,与UdpClient 的Receive无关了,那是线程做的事情了,while体内继续下一次Receive。而UDP面向无连接,不存在最大客户端数量问题。
第二个问题:你在启动线程同时,ReceivedByte ,IP作为参数进去就可以了
同时建立一个string数组,把你要记录的数据都写到string数组里(写到string数组之后,同时写一下txt文件),再用一个定时器定时把string数组里的东西更新到你要显示的控件里面去。
不存在专门的函数做这些,都要自己实现,
对于线程带参数 格式如下:
new Thread(delegate(){dotask(recivebytecopy,ipaddress)})start();
dotask实现:
void dotask(byte[] recive,string ipaddress)
{
//你要做的事情
}兄弟,我可以确切的告诉你,你的密码被盗了。
之前的那些:UDP登录服务器sztencentcom需要域名解析 都是在搜索IP地址,已便连接。
最能看出问题的就是:“收到登录服务器登录第二步骤的回应,登录失败,原因:登录失败,提示信息: 对不起,密码错误!”这句话~!!!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)