Socket问题,懂的请进 Socket.Recive(buffer,0,size) 这个函数什么情况会返回?我在服务端发一个较大的包,有时就会被拆成两个收到,就是说执行两次Recive的值加起来才是一个完整的数据。但是有时候有正常,这个Recive是收到什么标记还是什么时间就会结束返回? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 两种情况会返回:一、收到了一次数据,每次接收数据后,内部会有个数据的结束标志,这个微软没有公开,你也不需要知道是什么标志,如何用。二、发送方主动关闭Socket,此时Socket.Recive会取消阻塞状态,返回0字节接收,所以当收到0字节就只可能是对方主动关闭了Socket(除非有人无聊,真发生了0字节数据,这种情况没测试过)。 buffer,0,size,buffer返回数据,size返回实际接收的大小 这个方法Recive()只管接受数据,他无法确保本次接受的一定是完整的数据包必须自己处理包被截断的问题,给包加个头信息。存储包的类型、长度等等。 但是问题显然是这样的,我服务端调用了一次Send(buffer),然后到客户端却拆成了两个buffer,两个buffer的包长加起来正好等于我发送的长度。也就是说,recive收到一半的时候返回了,为什么? 接受端有buffer缓存的,缓存有大小的这个方法Recive()只管接受数据,他无法确保本次接受的一定是完整的数据包必须自己处理包被截断的问题,给包加个头信息。存储包的类型、长度等等。 收到了一次数据,每次接收数据后,内部会有个数据的结束标志,这个微软没有公开,你也不需要知道是什么标志,如何用。socket内部自己封装的东西, 而且不存在网络问题,因为我是本机发本机收。也没丢包,收到的两部份数据 加起来就是我发送的数据。(数据包长十几K的样子)而且只有偶尔会这样,发送越快,接收越慢(线程sleep),这种情况就越频繁,谁能解答。。 数据过大C#中的Socket会自己去识别包内容,在接收完全之后返回你要的内容,如果没有接受完则不返回东西,省去了你自己做一个拆包拼包的过程。 你发送多少不代表系统就给你一次性打包发送了,TCP会自动拆包发送的,如果是UDP,则直接给你丢弃(罢工不发)。为什么呢,因为一个IP数据包最大只能1500字节,超过了路由器上就不认了。如果你定义一个小于1500字节的数组,每次发送例如1K的数据出去,接收方就不会被拆了。至于接收次数你定不了,但可以在你的数据包前添加后续数据大小的信息,告知接收方。 当你的IP和端口接收到数据的时候,buffer会有返回this.ip = ip;this.port = port;this.threadCount = threadCount;socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress serverIp = IPAddress.Parse(this.ip);IPEndPoint iep = new IPEndPoint(serverIp, Convert.ToInt32(this.port)); //本地终结点socket.Bind(iep);//Socket类的一个重要函数, 绑定一个IP,socket.Listen(threadCount * 3);Byte[] byteMessage = new Byte[1024]; //存放消息的字节数组缓冲区, 注意数组表示方法,和C不同的.childSocket = socket.Accept(); //Socket类的一个重要的方法:Accept, 该方法接受来自外面的Socket连接请求, 并返回一个Socket套接字, 这个套接字就开始处理这一个client与Server之间的对话int intReceive = childSocket.Receive(byteMessage); //接受client发送过来的数据保存到缓冲区.程序会停在最后一句,直到你的IP和端口接收到数据 大数据包, 拆成小数据包发送, 每个小数据包都是一个独立的, 有标记头的包. 要标记这个小数据包属于那个大的包, 要有系列. 包头还有标记一共有多少数据长度. 当接收到当前数据长度不够总长度, 那么继续等待, 当够了, 就可以拿到这些小的数据包, 安装系列, 吧每个小的数据包的包头去掉, 组合成一个大的数据包, 然后解码. 参考Mina的编码,解码协议的事例. Entity Framework遇到的问题 C# CS架构下ftp断点续传 关于C#生成的程序问题? 我在MDI窗体上加一个Picture box 控件,目的是让底纹看起来不是黑黑的,但是会遮住子窗体如何处理 c# 怎么在菜单栏上添加竖的分隔线 类名后面的尖括号代表什么意思? C#发送邮件 请教高手一个关于从配置文件中读取数据库连接字符串的问题? 2005中的string.Replace()的问题 装箱可以理解为对象的转换吗? (新手)visual studio 2005是学习winform好尼?还是学习web好尼? 求一C#代码,计算点到直线垂直距离
一、收到了一次数据,每次接收数据后,内部会有个数据的结束标志,这个微软没有公开,你也不需要知道是什么标志,如何用。
二、发送方主动关闭Socket,此时Socket.Recive会取消阻塞状态,返回0字节接收,所以当收到0字节就只可能是对方主动关闭了Socket(除非有人无聊,真发生了0字节数据,这种情况没测试过)。
必须自己处理包被截断的问题,给包加个头信息。存储包的类型、长度等等。
但是问题显然是这样的,我服务端调用了一次Send(buffer),然后到客户端却拆成了两个buffer,两个buffer的包长加起来正好等于我发送的长度。也就是说,recive收到一半的时候返回了,为什么?
接受端有buffer缓存的,缓存有大小的这个方法Recive()只管接受数据,他无法确保本次接受的一定是完整的数据包
必须自己处理包被截断的问题,给包加个头信息。存储包的类型、长度等等。
收到了一次数据,每次接收数据后,内部会有个数据的结束标志,这个微软没有公开,你也不需要知道是什么标志,如何用。
socket内部自己封装的东西,
也没丢包,收到的两部份数据 加起来就是我发送的数据。(数据包长十几K的样子)
而且只有偶尔会这样,发送越快,接收越慢(线程sleep),这种情况就越频繁,
谁能解答。。
this.ip = ip;
this.port = port;
this.threadCount = threadCount;
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress serverIp = IPAddress.Parse(this.ip);
IPEndPoint iep = new IPEndPoint(serverIp, Convert.ToInt32(this.port)); //本地终结点
socket.Bind(iep);//Socket类的一个重要函数, 绑定一个IP,
socket.Listen(threadCount * 3);
Byte[] byteMessage = new Byte[1024]; //存放消息的字节数组缓冲区, 注意数组表示方法,和C不同的.childSocket = socket.Accept(); //Socket类的一个重要的方法:Accept, 该方法接受来自外面的Socket连接请求, 并返回一个Socket套接字, 这个套接字就开始处理这一个client与Server之间的对话int intReceive = childSocket.Receive(byteMessage); //接受client发送过来的数据保存到缓冲区.
程序会停在最后一句,直到你的IP和端口接收到数据
参考Mina的编码,解码协议的事例.