经过一番研究,终于可以确认,.net socket的beginSend和beginReceive用的是完成端口。(windows 98上不是,因为98没有这样的机制)。如果微软没有撒谎的话。
发送大量数据时,Socket.BeginSend和Socket.Send的速度是有差别的。在局域网里面,这种差别表现不明显。
但是在一个高延迟的网络中,差别就很大。
Socket.Send方法是可靠的。但是Send的时候,是等到缓冲区发出的包被确认以后才继续发送后续的包。所以,即使网络的带宽很大,但是如果网络延迟高,发送速度也会很慢。
Socket.BeginSend(异步)是把要发送的数据直接写入缓冲区,然后调用返回。BeginSend发送的时候,并不能确定发送是否成功。BeginSend的时候,指定了一个回调方法,发送成功后,系统会调用这个回调方法。在回调方法中,可以通过EndSend来检查实际发送的字节数。
虽然msdn中没有说明,但是实际上在EndSend中返回的字节数总是等于发送的字节数,或者抛出异常。
BeginSend的发送速度,可以占用全部的网络带宽。而Send的速度受网络延时的影响很大。在网络延迟高的网络中,可能每秒只有几K的速度。实际上,这个速度大致等于系统发送时的每个ip包的大小除以网络延迟的秒数。
完成端口使用的要点,就是减少系统中线程的数量。
所以,不要以为用了BeginSend就一定可以提高系统的负载能力。主要还是在于减少系统中工作的线程数量。所以,尽量不要在线程中使用阻塞的方法。

Socket.BeginReceive方法和Socket.Receive方法,对接受的速度没有影响。因为根据tcp协议,既然这个包已经到了应用 层,那么肯定是已经实际收到了。用BeginReceive的优势是在于可以不阻塞线程,从而减少系统中工作的线程。对于负载量不大的系统,用 Receive就可以了。Receive的逻辑比较简单。但是需要记住一点,Receive时返回的字节数,不一定等于要求读取的字节数。系统只是在数据 包到达时,尽可能的读取要求的字节数。

.net的Socket Api其实是对系统Socket Api的封装。所以以上的说法同样适用于winsock。但是由于BeginSend方法封装了完成端口,所以可以在获得高性能的同时,少了很多麻烦。对于网络的编程,是非常美妙的一件事情。

BeginSend需要注意的是,一定要控制发送的速度。否则,这个连接一定会因为系统缓冲区满而抛出异常。控制速度的办法就是在发送时计算发送的包数 量,在EndSend的时候计算发送成功的包数量。在发送之前,检查未发送的包数量,如果小于预设值则发送,否则暂停。这个地方会阻塞线程,所以也不是最 好的方法,比较好的办法,是自己做个发送缓冲队列。然后用一个专门的线程来处理发送。这样,只要用很少的线程,就可以处理发送。虽然BeginSend用 了完成端口,但是如果在系统中有大量被阻塞的线程,那就违背了完成端口的本意。

beginSend和beginReceive相关推荐

  1. 译文:如何使用SocketAsyncEventArgs类(How to use the SocketAsyncEventArgs class)

    转载自: http://blog.csdn.net/hulihui/article/details/3244520 原文:How to use the SocketAsyncEventArgs cla ...

  2. .net socket与完成端口、异步发送相关研究

    原帖地址:http://www.cnsw.org/bbs/thread-68634-1-1.html 经过一番研究,终于可以确认,.net socket的beginSend和beginReceive用 ...

  3. Unity开发-网络.算法.平台相关知识!

    A. 网络相关知识 一.TCP 1.面向数据流.可靠.能保证消息到达顺序. 2.滑动窗口.控制发送量,发送方只能发送窗口内大小的数据包.防止发送方发送的数据过多,接收方无法处理的情况. 3.Nagle ...

  4. C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

    原创性申明 本文作者:小竹zz  博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处 引言 我一直在探寻一个高性 ...

  5. C# UdpClient使用Receive和BeginReceive接收消息时的不同写法

    使用Receive(同步阻塞方式), 注意使用同步方法时,需要使用线程来开始方法,不然会使UI界面卡死 IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPA ...

  6. java socket 打印机_socket.BeginReceive()使打印机无响应

    我一直在开发一个应用程序,它可以在到达时自动在特定网络打印机上打印PDF文件并监控 @PJL USTATUS JOB 消息 . 但是,每当我开始我的应用程序并且代码命中 socket.BeginRec ...

  7. 第三篇 (.net socket 与 android )

    直接奔主题,come on~! C# 服务端 代码: using System; using System.Collections.Generic; using System.ComponentMod ...

  8. C# socket编程实践——支持广播的简单socket服务器

    在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...

  9. 请教如何改善C#中socket通信机客户端程序的健壮性

    请教如何改善c#中socket通信机客户端程序的健壮性 我是做socket的新手,最近做了一个socket客户端程序,连接server的时候,如果server存在,并且允许连接的话,程序无错,正常执行 ...

最新文章

  1. 正则表达式口诀及教程(推荐)
  2. 计算机系统概论寻址空间,自考《计算机系统结构》重点知识概论:数据表示(二)...
  3. Exchange bin先常用工具
  4. el-table中怎样设置标题栏颜色以及每一行颜色交替不同的效果
  5. php 使用redis锁限制并发访问类
  6. Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群
  7. [js] 写一个方法判断数组内元素是否全部相同
  8. 使用jQuery Mobile移动开发框架将博客网站快速转化为Mobile网站
  9. python格式化输入_python-格式化(%,format,f-string)输出+输入
  10. 基于OneAPM的Web系统性能监测
  11. 爬虫实战(一)之爬取房天下新房数据
  12. 能够兼容ViewPager的ScrollView
  13. java集合框架之LinkedList
  14. java实例化泛型_Java让泛型实例化的方法
  15. linux比较好的网站和博客
  16. CSS 代码语法 代码注释
  17. java 防止js注入----ESAPI结合Top10安全开发实战
  18. “大雪无情,卡巴有情”,卡巴斯基赠送一年免费正版激活码
  19. 《望洞庭湖赠张丞相》 孟浩然
  20. 旅游吧!我在这里 ——旅游相册POI搜索:找回你的足迹

热门文章

  1. Ra-08透传固件应用
  2. h5 添加网页背景动画效果,跟随鼠标移动的线条
  3. 怎样直接下载网页中的视频
  4. ProxmoxVE下安装AdGuard
  5. java怎样获取汉字的首字母_[JAVA]获得汉字的拼音首字母
  6. Unity 之 Vector3 类简介
  7. GPT-4 开启 “软件工程3.0” 全新时代
  8. 数字藏品和传统藏品的区别?
  9. 不想落伍就得顺应时代的发展,开发APP有什么好处你知道吗?
  10. json在线解析与格式化