C# socket 异步接收 问题

问题描述

各位大神:C#写的异步客户端的接收回调publicvoidreadCallback(IAsyncResultar){StateObjectstate=(StateObject)ar.AsyncState;Sockethandler=state.WorkSocket;intread=handler.EndReceive(ar);if(read>0){state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,read));handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,newAsyncCallback(readCallback),state);}else{if(state.sb.Length>1){stringcontent=state.sb.ToString();Console.WriteLine("Read{0}bytesfromsocket.nData:{1}",content.Length,content);}}}问题如下:如果服务端发送过来的数据没有自定义的包头和包尾,长度不定,且缓冲区设置小于接收包长度,也就是需要再次或多次读取,怎么保证读取的数据完整和不重复?求思路和方法,多谢指点感激不尽。

解决方案

解决方案二:
自己给自己找麻烦,没有校验信息,只能让老天爷赐予你幸运吧,建议你改传输结构
解决方案三:
引用楼主tianchao123456的回复:

问题如下:如果服务端发送过来的数据没有自定义的包头和包尾,长度不定,且缓冲区设置小于接收包长度,也就是需要再次或多次读取,怎么保证读取的数据完整和不重复?求思路和方法,多谢指点感激不尽。

首先有几个基本的知识错误。缓冲区大小跟接受完整不完整无关。假设对一次Send8k字节内容,而你的缓冲区大小是128k,也完全可能分包啊。谁跟你说分包是因为你的应用程序的接受缓冲区设置的“小”而造成的呢?另一个问题,你的原问题。所谓“发过来的数据”,如果就扔在你面前,请问你怎么识别消息?如果你连“人”都说不出怎么识别的规范,你想靠抄写别人的代码就告诉你如何识别你的数据?那么你这种学习方法也太奇葩了,而且也不会自己设计出任何实际的程序。(可是很多人偏偏就是靠瞎蒙、然后求人给写代码来进程程序设计的,而自己不把道理先说明白)
解决方案四:
对于tcp来说,分包、粘包是最基本的概念,不要拿它来说什么“数据不完整”。你本来就应该学会分包读取数据。tcp保证数据的次序正确,而且也不重复。用不着担心它“重复”。
解决方案五:
TCP粘包解决
解决方案六:
引用1楼bdmh的回复:

自己给自己找麻烦,没有校验信息,只能让老天爷赐予你幸运吧,建议你改传输结构

通过验证问题中的那种结构确实不能正确处理,听人劝,吃饱饭,数据已按照已有协议传送
解决方案七:
引用2楼sp1234的回复:

Quote: 引用楼主tianchao123456的回复:
问题如下:如果服务端发送过来的数据没有自定义的包头和包尾,长度不定,且缓冲区设置小于接收包长度,也就是需要再次或多次读取,怎么保证读取的数据完整和不重复?求思路和方法,多谢指点感激不尽。

首先有几个基本的知识错误。缓冲区大小跟接受完整不完整无关。假设对一次Send8k字节内容,而你的缓冲区大小是128k,也完全可能分包啊。谁跟你说分包是因为你的应用程序的接受缓冲区设置的“小”而造成的呢?另一个问题,你的原问题。所谓“发过来的数据”,如果就扔在你面前,请问你怎么识别消息?如果你连“人”都说不出怎么识别的规范,你想靠抄写别人的代码就告诉你如何识别你的数据?那么你这种学习方法也太奇葩了,而且也不会自己设计出任何实际的程序。(可是很多人偏偏就是靠瞎蒙、然后求人给写代码来进程程序设计的,而自己不把道理先说明白)

感谢回复!可能问题表述还是有一些不准确的地方。缓冲区大小跟接受完整不完整无关,这个知识点我还是知道的。之前比较疑惑的是如果客户端发送100字节,服务端缓冲区是20字节,那么readCallback就应该反复被调用直到没有数据,这里应该是取了5次。5次过后程序并没有走if(read>0)else{}的else块,难道是判断不对吗?我的原问题,这位大哥说的很对,我都不知道规范和原数据就想要硬去处理,显然不太现实。一个问题:分包我觉得应该是在客户端进行的,也就是给数据"包'加个“头”和“尾”以便处理?是这样吗?
解决方案八:
引用3楼sp1234的回复:

对于tcp来说,分包、粘包是最基本的概念,不要拿它来说什么“数据不完整”。你本来就应该学会分包读取数据。tcp保证数据的次序正确,而且也不重复。用不着担心它“重复”。

受益匪浅。关于分包和粘包还请不吝赐教!
解决方案九:
一个问题:分包我觉得应该是在客户端进行的跟客户端还是服务端没有关系你接收的时候就必须处理分包问题
解决方案十:
引用8楼Z65443344的回复:

一个问题:分包我觉得应该是在客户端进行的跟客户端还是服务端没有关系你接收的时候就必须处理分包问题

是不是这样理解,分包不是“拆分”而是“分别”,就是接受时每次都对读过来的“包”进行判断,或留或丢弃
解决方案十一:
引用4楼wangjun8868的回复:

TCP粘包解决

学习了粘包的思想是不是就是加头和尾,接收是进行逻辑判断?
解决方案十二:
引用10楼tianchao123456的回复:

Quote: 引用4楼wangjun8868的回复:
TCP粘包解决

学习了粘包的思想是不是就是加头和尾,接收是进行逻辑判断?

是这样的

时间: 2024-08-04 06:23:25

C# socket 异步接收 问题的相关文章

java nio socket 异步接收数据

问题描述 nio socket 异步接收数据,如何确定收接的数据,就是发送的返回的?有谁研究过没. 问题补充:如果不用id,nio客户端是否可以同步接收数据呢?是把socketChannel.configureBlocking(true)吗? 解决方案 在消息中增加UUID,在调用端记录UUID,并将UUID和消息一起发送到服务端,服务端的回传消息附件上UUID,调用端根据收到的消息包含的UUID确定给哪个调用者.解决方案二:异步调用的常见问题.因为没有办法实施返回,只有打标志了.要你把通信协议

.net的socket异步通讯示例分享

 这篇文章主要介绍了.net的socket异步通讯示例,操作在下面,需要的朋友可以参考下 1.首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client   2.然后添加服务端代码,添加命名空间,界面上添加TextBox控件    代码如下: using System.Net; using System.Net.Sockets;     3.FormLoad方法添加代码    代码如下: private void Form1_Load(object sender,

.net的socket异步通讯示例分享_实用技巧

1.首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2.然后添加服务端代码,添加命名空间,界面上添加TextBox控件 复制代码 代码如下: using System.Net;using System.Net.Sockets; 3.FormLoad方法添加代码 复制代码 代码如下: private void Form1_Load(object sender, EventArgs e)        {            IPEndPoint epS

socket 通信 异步接收

问题描述 privatevoidReceiveCallBack(IAsyncResultar){StateObjectstate=(StateObject)ar.AsyncState;SocketserverSocket=state.workSocket;try{intbytesRead=serverSocket.EndReceive(ar);if(bytesRead>0){byte[]data=newbyte[bytesRead];//实际接收的数据Buffer.BlockCopy(state

TCP通信socket异步,客户端报异常:目标主机积极拒绝

问题描述 TCP通信socket异步,客户端报异常:目标主机积极拒绝 服务端只监听时,客户端建立1500个连接请求都可以正常建立连接,但当服务端改成建立连接后触发一个事件给客户端发送数据时,客户端异常:目标主机积极拒绝,只能建立部分连接.是何原因,希望有老师可以指点一下.不胜感激!! 解决方案 Socket(Tcp)通信客户端 解决方案二: 客户端接收的数据是否正确处理,然后就是看一下你服务器发送数据给客户端后,是不是关闭了连接

c# 2.0-C#用Socket异步时出现错误

问题描述 C#用Socket异步时出现错误 各位大侠: 我刚用 C# 写Socket 代码,服务器端用异步监控客户端,代码如下 //开启服务器端监控---Begin internal void MonitorClient() { IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 端口号); Socket serverSocket = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolT

C# socket networkstream 接收数据

问题描述 C# socket networkstream 接收数据 最近在做c/s,客户端用C#的Socket进行通信.接收数据开单独的接收线程使用networkstream进行接收接收的方法大体上跟网上流传的一样do{ int readSize = mNetworkstream.Read(bytes 0 1024); if (readSize > 0) { //do sth }}while(mNetworkstream.DataAvailable) 这样接收局内网或者单机没问题,但是放到外网测

C# SOCKET异步,Wineows服务 ,服务

问题描述 用Windows服务写的一个Socket异步服务器,用来解析和处理客户端上传的数据,客户端有100多个吧,刚开始运行正常,几个小时后,服务还在运行,但不能解析客户端的数据了,而且客户端也连不上了,重新了一下服务,又好了,求高手解决,主要代码如下:privateManualResetEventallDone=newManualResetEvent(false);//启动服务方法publicvoidInitRfidServer(){try{//实例化套接字(ip4寻址协议,流式传输,TCP

关于Socket异步编程的思路

问题描述 这几天一直在研究关于Socket的编程,因为之前完全没接触过,在网上查了很多关于这方面的资料,感觉雷同的很多,不知道为什么异步的时候还加个信号量处理,还有主要是目前需要同时连接两个服务器,客户端需要对不同的服务器传回的数据进行处理,如果采用异步的方法,有好几个回调方法,一个服务器还好,如果多出几个服务器,难道那些回调方法需要再重写一遍吗?而且异步的回调除了IAsyncResultar,又没法传递其他参数,而且也没有返回值,不知何解,可能主要是流程不太清楚把,网上都是前篇一律,不知道谁做