SOCKET通讯的一些试验
一直很不明白UDP和TCP两种协议的优劣,趁着最近要弄个简易的消息处理中心的机会,做了点试验:
1. 单UDP端口的服务器,模型如下
这里工作线程有一个UDP的SOCKET(即分配了一个独立的UDP端口),它发送信息给服务器,然后等待服务器返回信息,然后再发送下一个信息,即此模型是一应一答的。而服务器端,接收线程监听一固定端口来接收信息,并记录远程IP和PORT;发送线程根据记录的远程IP和PORT,回馈信息。
试验:现在给每个工作线程分配10个请求(RESET),并请求10次,一共有10个工作线程,那么服务器端应该处理1000个请求,为了不让请求太快,每个工作线程在收到服务器应答后等待10毫秒
结果:任务分配开始2秒后线程完成所有请求,查看服务器端接收线程日志,发现收到所有1000条请求,但有异常的请求出现,如下图:
而这种请求不少,推断是接收信息时把几个UDP包一起收到一个信息里面了,但很奇怪,接收的数量还是1000条。我猜想是由于在某一时刻,同时到达了几个UDP包造成这种异常。如果要去除异常就需要在信息头加上信息长度,这样就会避免有异常信息搅乱逻辑信息了。不过个人觉得纯粹用UDP来做多客户端的服务器通讯,还是会有很多问题的,还是推荐用TCP,这就是为啥TCP要在接收时创建一个新SOCKET的原由吧。由此看IIS之类服务器用TCP还是有道理的,呵呵。