深入探讨C#中Socket一次性搞定消息发送

摘要:
(1) 该体系结构基于TCP协议的套接字通信。该体系结构类似于B/S体系结构,具有一个套接字通信服务器和多个套接字通信客户端。当套接字通信服务器启动时,将建立侦听套接字。侦听套接字将侦听套接字连接传输到接收套接字,然后接收套接字将完成消息的接收和发送。当套接字出现异常时,将断开连接。特别是,池被广泛使用。池通常包括以下类型:1)缓冲池,用于集中控制套接字缓冲区并防止内存碎片。2) SAEA池用于集中控制和重用套接字。
转载自:http://tech.chinaunix.net/a2010/0909/1101/000001101396.shtml
    【IT168 技术文档】最近浏览了几篇有关Socket发送消息的文章,发现大家对Socket Send方法理解有所偏差,现将自己在开发过程中对Socket的领悟写出来,以供大家参考。

  (一)架构

  基于TCP协议的Socket通信,架构类似于B/S架构,一个Socket通信服务器,多个Socket通信客户端。Socket通信服务器启动时,会建立一个侦听Socket,侦听Socket将侦听到的Socket连接传给接受Socket,然后由接受Socket完成接受、发送消息,当Socket存在异常时,断开连接。在实际开发项目中,往往要求Socket通信服务器能提供高效、稳定的服务,一般会用到以下技术:双工通信、完成端口、SAEA、池、多线程、异步等。特别是池,用的比较多,池一般包括一下几种:

  1)Buffer池,用于集中管控Socket缓冲区,防止内存碎片。

  2)SAEA池,用于集中管控Socket,重复利用Socket。

  3)SQL池,用于分离网络服务层与数据访问层(SQL的执行效率远远低于网络层执行效率)

1
 

  (二)Send

  主服务器接受Socket为一端口,客户端Socket为一端口,这两个端口通过TCP协议建立连接,通信基础系统负责管理此连接,它有两个功能:

  1)发送消息

  2)接受消息

  Socket的Send方法,并非大家想象中的从一个端口发送消息到另一个端口,它仅仅是拷贝数据到基础系统的发送缓冲区,然后由基础系统将发送缓冲区的数据到连接的另一端口。值得一说的是,这里的拷贝数据与异步发送消息的拷贝是不一样的,同步发送的拷贝,是直接拷贝数据到基础系统缓冲区,拷贝完成后返回,在拷贝的过程中,执行线程会IO等待, 此种拷贝与Socket自带的Buffer空间无关,但异步发送消息的拷贝,是将Socket自带的Buffer空间内的所有数据,拷贝到基础系统发送缓冲区,并立即返回,执行线程无需IO等待,所以异步发送在发送前必须执行SetBuffer方法,拷贝完成后,会触发你自定义回调函数ProcessSend,在ProcessSend方法中,调用SetBuffer方法,重新初始化Buffer空间。

1
 

  口说无凭,下面给个例子:

  服务器端:

1
 

  客户端:

1
 

  解释:

  客户端第一次发送数据:1234567890。

  客户端第一个接受数据:1234567890,该数据由服务端用Send同步方法发送返回。

  客户端第二个接受数据:1234567890,该数据由服务端用Send异步方法发送返回。

  以上似乎没什么异常,好,接下来,我只发送abc。

  客户端第一个接受数据:abc,理所当然,没什么问题。

  客户端第二个接受数据:abc4567890!为什么呢?应该是abc才对呀! 

  好,现在为大家解释一下:

  异步发送是将其Buffer空间中所有数据拷贝到基础系统发送缓冲区,第一次拷贝1234567890到发送缓冲区,所以收到1234567890,第二次拷贝abc到发送缓冲区,替换了先前的123,所以收到abc4567890,大家明白的?

免责声明:文章转载自《深入探讨C#中Socket一次性搞定消息发送》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇用vue 写h5页面-摇一摇MySqlHelper、CacheHelper下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【linux】【qt5】【将linux下的qt程序打包发布(完全适用于中标麒麟)】

前言: 最近因项目需求,需要打包linux-qt程序给客户先用一下子。百度一大堆终于找了几个靠谱的来综合一下,留为备用吧。 由于是先遣版所以仅制作为免安装程序的格式。 正文: 博主的qt是5.9.2的,程序名称为ocs,下面看到这个名称替换成自己的就是了。 1.先找个地方,比如桌面创建一个名字为OCS的空文件夹用于放打包后的文件。 2.将项目使用Relea...

UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

1、阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是<0:出错,=0:连接关闭,>0接收到数据大小,特别:返回 值<0时并且(errno==EINTR||errno==EWOULDBLOCK||errno==EAGAIN)的情况 下认为连接是正常的,继续接收。只是阻...

前端基础总结

HTML初识 △HTML: 超文本标记语言,是一种用于创建网页的标记语言,不是编程语言,没有逻辑 本质上是浏览器可识别的规则 我们按照规则写网页,浏览器根据规则渲染我们的网页。对于不同的浏览器,对同一个标签可能会有不同的解释。(兼容性问题) 网页文件的扩展名:.html或.htm(没有区别) 网页文件的扩展名:.html或.htm(没有区别) 我们按照规则...

ESP8266使用详解

[From] http://www.cnblogs.com/yangfengwu/p/5205570.html 用的这款   各引脚功能:来至厂家提供的资料 GPIO0 默认是工作模式(不接线)。如果接了低电平就是下载模式(给模块刷固件!!),所以可以不接线,当然也可以接高电平。 反正一开始连接的时候CH_PD必须为高电平。其余的可以不接。...

.net平台下C#socket通信(上)

完全是基础,新手可以随意看看,大牛可以关闭浏览页了,哈哈。 在开始介绍socket前先补充补充基础知识,在此基础上理解网络通信才会顺理成章,当然有基础的可以跳过去了。都是废话,进入正题。   TCP/IP:Transmission Control Protocol/Internet Protocol,传输控制协议/因特网互联协议,又名网络通讯协议。简单来说...

Domain Socket本地进程间通信

socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答...