简单的c# TCP通讯(TcpListener)

C# 的TCP Socket (同步方式)

C# 的TCP Socket (异步方式)

C# 的tcp Socket设置自定义超时时间

C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全

服务器端:

  1. public static ManualResetEvent allDone = new ManualResetEvent(false);
  2.  
  3. IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
  4. Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  5.  
  6. listener.Bind(localEndPoint);
  7. listener.Listen();
  8. while (true)
  9. {
  10. allDone.Reset();
  11. listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
  12. allDone.WaitOne();
  13. }
  1. public static void AcceptCallback(IAsyncResult ar)
  2. {
  3. try
  4. {
  5. if (IsListening)
  6. {
  7. allDone.Set();
  8. Socket listener = (Socket)ar.AsyncState;
  9. Socket handler = listener.EndAccept(ar);
  10. StateObject state = new StateObject();
  11. state.workSocket = handler;
  12. handler.BeginReceive(state.headbuffer, , StateObject.HeadBufferSize, ,
  13. new AsyncCallback(ReceiveHead), state);
  14. }
  15. }
  16. catch (System.Exception ex)
  17. {
  18. log.ErrorFormat("AcceptCallback异常,原因:{0}", ex.Message);
  19. }
  20. }
  21.  
  22. private static void ReceiveHead(IAsyncResult ar)
  23. {
  24. try
  25. {
  26. StateObject state = (StateObject)ar.AsyncState;
  27. Socket handler = state.workSocket;
  28. int bytesRead = handler.EndReceive(ar);
  29.  
  30. uint length = ByteTouint(state.headbuffer, , );
  31. state.length = (int)length - state.headbuffer.Length;
  32. state.bodybuffer = new byte[length - state.headbuffer.Length];
  33. handler.BeginReceive(state.bodybuffer, , state.bodybuffer.Length, ,
  34. new AsyncCallback(ReadCallback), state);
  35. }
  36. catch (System.Exception ex)
  37. {
  38. log.ErrorFormat("ReceiveHead异常,原因:{0}", ex.Message + ex.StackTrace);
  39. }
  40. }
  1. public static void ReadCallback(IAsyncResult ar)
  2. {
  3. StateObject state = (StateObject)ar.AsyncState;
  4. Socket handler = state.workSocket;
  5.  
  6. int bytesRead = handler.EndReceive(ar);
  7. //接收的字节在state.bodybuffer里,下面开始处理
  8.  
  9. }

已知接收长度的话可以把ReceiveHead函数去掉,直接进入ReadCallback里。

加入ReceiveHead是因为协议一般在开头几个固定的字节里有后面数据包的长度,所以先接收头,再根据解析出的数据包长度接收后面的。

  1. StateObject定义如下,可以不要headbuffer HeadBufferSize
  1. public class StateObject
  2. {
  3. public Socket workSocket = null;
  4. public const int HeadBufferSize = ;
  5.  
  6. public byte[] headbuffer = new byte[HeadBufferSize];
  7. public byte[] bodybuffer;
  8. public int length;
  9. }

客户端发送数据  C# 的TCP Socket (同步方式)

C# 的TCP Socket (异步方式)的更多相关文章

  1. C# 的TCP Socket (同步方式)

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  2. C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼

    异步 相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下 ...

  3. ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用!因此,ES transport client可以同步调用也可以异步(不过底层的socket必然是异步实现)

    ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用! 因此,ES tra ...

  4. C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  5. C# 的tcp Socket设置自定义超时时间

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  6. C# Socket编程(5)使用TCP Socket

    TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer) ...

  7. socket异步编程--libevent的使用

    使用 libevent 和 libev 提高网络应用性能 http://www.ibm.com/developerworks/cn/aix/library/au-libev/ libevent实现ht ...

  8. 再次回首 TCP Socket服务器编程

    转载:http://www.cnblogs.com/zc22/archive/2010/06/27/1766007.html ------------------ 前言 --------------- ...

  9. [转] socket异步编程--libevent的使用

    这篇文章介绍下libevent在socket异步编程中的应用.在一些对性能要求较高的网络应用程序中,为了防止程序阻塞在socket I/O操作上造成程序性能的下降,需要使用异步编程,即程序准备好读写的 ...

随机推荐

  1. 【译】Spring 4 Hello World例子

    前言 译文链接:http://websystique.com/spring/spring-4-hello-world-example-annotation-tutorial-full-example/ ...

  2. 使用rsync同步目录

    本文描述了linux下使用rsync单向同步两个机器目录的问题. 使用rsync同步后可以保持目录的一致性(含删除操作). 数据同步方式 从主机拉数据 备机上启动的流程 同步命令: rsync -av ...

  3. 1.2 - C#语言习惯 - 用运行时常量readonly而不是编译期常量const

    C#中有两种类型的常量:编译期常量和运行时常量.二者有着截然不同的行为,使用不当将会带来性能上或正确性上的问题. 这两个问题最好都不要发生,不过若难以同时避免的话,那么一个略微慢一些但能保证正确的程序 ...

  4. MySQL排序原理与案例分析

    前言      排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct ...

  5. JavaScript & PHP模仿C#中string.format效果

    1.JavaScript function stringformat() { var args = Array.prototype.slice.call(arguments); if (args.le ...

  6. 项目游戏开发日记 No.0x000002

    14软二杨近星(2014551622) 项目开发的开始, 到现在已经很久了, 软件工程的课也上了很久了, 不过, 我们的游戏现在依然还没有影子, 只能说...还是啥也不会... 从一开始, 兴致勃勃地 ...

  7. POJ 2398 Toy Storage(计算几何)

    题意:给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数. 题解:通过斜率判断一个点是否在两条线段之间. /** 通过斜率比较点是否在两线段之 ...

  8. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  9. codevs 2879 堆的判断

    codevs 2879 堆的判断 http://codevs.cn/problem/2879/ 题目描述 Description 堆是一种常用的数据结构.二叉堆是一个特殊的二叉树,他的父亲节点比两个儿 ...

  10. Class.forName和ClassLoader.loadClass等

    Class类 首先,Class类里可以记载所有类的属性.方法等信息.这个也就是运行时类别标记,它记录了所有的对象(比如int,MyClass,void,数组等等)对应的类信息. Class对象 JVM ...