C# 的TCP Socket (异步方式)
C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
服务器端:
- public static ManualResetEvent allDone = new ManualResetEvent(false);
- IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
- Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- listener.Bind(localEndPoint);
- listener.Listen();
- while (true)
- {
- allDone.Reset();
- listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
- allDone.WaitOne();
- }
- public static void AcceptCallback(IAsyncResult ar)
- {
- try
- {
- if (IsListening)
- {
- allDone.Set();
- Socket listener = (Socket)ar.AsyncState;
- Socket handler = listener.EndAccept(ar);
- StateObject state = new StateObject();
- state.workSocket = handler;
- handler.BeginReceive(state.headbuffer, , StateObject.HeadBufferSize, ,
- new AsyncCallback(ReceiveHead), state);
- }
- }
- catch (System.Exception ex)
- {
- log.ErrorFormat("AcceptCallback异常,原因:{0}", ex.Message);
- }
- }
- private static void ReceiveHead(IAsyncResult ar)
- {
- try
- {
- StateObject state = (StateObject)ar.AsyncState;
- Socket handler = state.workSocket;
- int bytesRead = handler.EndReceive(ar);
- uint length = ByteTouint(state.headbuffer, , );
- state.length = (int)length - state.headbuffer.Length;
- state.bodybuffer = new byte[length - state.headbuffer.Length];
- handler.BeginReceive(state.bodybuffer, , state.bodybuffer.Length, ,
- new AsyncCallback(ReadCallback), state);
- }
- catch (System.Exception ex)
- {
- log.ErrorFormat("ReceiveHead异常,原因:{0}", ex.Message + ex.StackTrace);
- }
- }
- public static void ReadCallback(IAsyncResult ar)
- {
- StateObject state = (StateObject)ar.AsyncState;
- Socket handler = state.workSocket;
- int bytesRead = handler.EndReceive(ar);
- //接收的字节在state.bodybuffer里,下面开始处理
- }
已知接收长度的话可以把ReceiveHead函数去掉,直接进入ReadCallback里。
加入ReceiveHead是因为协议一般在开头几个固定的字节里有后面数据包的长度,所以先接收头,再根据解析出的数据包长度接收后面的。
- StateObject定义如下,可以不要headbuffer HeadBufferSize
- public class StateObject
- {
- public Socket workSocket = null;
- public const int HeadBufferSize = ;
- public byte[] headbuffer = new byte[HeadBufferSize];
- public byte[] bodybuffer;
- public int length;
- }
客户端发送数据 C# 的TCP Socket (同步方式)
C# 的TCP Socket (异步方式)的更多相关文章
- C# 的TCP Socket (同步方式)
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼
异步 相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下 ...
- ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用!因此,ES transport client可以同步调用也可以异步(不过底层的socket必然是异步实现)
ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用! 因此,ES tra ...
- C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- C# 的tcp Socket设置自定义超时时间
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- C# Socket编程(5)使用TCP Socket
TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer) ...
- socket异步编程--libevent的使用
使用 libevent 和 libev 提高网络应用性能 http://www.ibm.com/developerworks/cn/aix/library/au-libev/ libevent实现ht ...
- 再次回首 TCP Socket服务器编程
转载:http://www.cnblogs.com/zc22/archive/2010/06/27/1766007.html ------------------ 前言 --------------- ...
- [转] socket异步编程--libevent的使用
这篇文章介绍下libevent在socket异步编程中的应用.在一些对性能要求较高的网络应用程序中,为了防止程序阻塞在socket I/O操作上造成程序性能的下降,需要使用异步编程,即程序准备好读写的 ...
随机推荐
- AEAI HR_v1.5.2升级说明,开源人力资源管理系统
1.升级说明 本次AEAI HR升级内容主要是针对数通畅联推出AEAI ECP企业云联平台而升级的,其中对AEAI HR的各模块进行扩展,同时增加了移动门户版功能及为AEAI ECP提供数据服务接口. ...
- Percona TokuDB
Percona TokuDB Percona TokuDB 1. TokuDB说明 2. TokuDB安装 3. 使用TokuDB 3.1 快速插入和富索引 3.2 聚集sec ...
- [iOS]ReactiveCocoa安装方法
1. 替换Ruby镜像 我们想要使用CocoaPods来安装ReactiveCocoa.由于OS X上的Ruby镜像被墙了,感谢淘宝为我们提供了国内访问镜像. $ gem sources --remo ...
- 取消chrome浏览器下input和textarea的默认样式;html5默认input内容清除“×”按钮去除办法
取消chrome浏览器下input和textarea的默认样式: outline:none;/*清空chrome中input的外边框*/ html5默认input内容清除“×”按钮去除办法: inpu ...
- 项目自动化建构工具gradle 入门4——javaWeb在浏览器中显示helloWorld
在java应用中,其实做的最多的还是java web应用.所以现在我们做的就是用gradle构建一个简单的web项目,简单点,直接上代码吧. 1.进入目录D:\work\gradle\web,新建文件 ...
- 使用maven给spring项目打可直接运行的jar包(配置文件内置外置的打法)
从网上看过许多打jar包的例子,大多是将配置文件打进jar包的.经过本人一番研究,终于搞清楚了怎样将jar包的配置文件外置. 废话不说,直接上spring的pom.xml的配置文件. <proj ...
- 【译】什么是 web 框架?
Web 应用框架,或者简单的说是“Web 框架”,其实是建立 web 应用的一种方式.从简单的博客系统到复杂的富 AJAX 应用,web 上每个页面都是通过写代码来生成的.我发现很多人都热衷于学习 w ...
- canvas arcTo()用法详解
CanvasRenderingContext2D对象的方法arcTo()的用法. arcTo(x1, y1, x2, y2, radius) arcTo()方法将利用当前端点.端点1(x1,y1)和端 ...
- 那些年我们学过的构造函数(构造方法,C#)
构造函数也称构造方法,在面向对象中称为构造方法,在面向过程中称为构造函数;C#是面向对象的语言,所以以下都称为构造方法, OK,下面我们先看一下什么是构造函数 class Dog { //创建一个狗类 ...
- CPU中断和轮询
轮询顾名思义,CPU不停的询问,CPU很忙. 中断和轮询不同,是硬件上的,就像一个开关被按下了,没有什么东西在不停的询问开关有没有被按下,开关只是被按下了,就通电了,通电了就会发声一些事情. 可以看看 ...