使用 Socket.Receive 方法接收資料時要如何判斷資料已全部接收完畢??

问题描述

我目前的方法是Socket.Available這個屬性來實作,如以下的代碼:while(Socket.Available>0)....略Socket.Receive}但是Socket.Available只是取得已經從網路接收的資料量而已..所以如果網路回應的比較慢,資料還沒有被讀入到緩衝區內..那Socket.Available就會返回0,直到又從網路接收到新的資料後Socket.Available才會大於0因此很多時候上面的代碼根本還沒把資料全部接收完畢就跳離迴圈了!!我搜尋很多文章看到大家也都是根據Socket.Available來接收資料..難道不會和我遇到同樣的問題嗎??資料還沒真正讀完就跳出來了??要怎樣才能解決這問題呢??有像c語言有feof可以測試Socket已經讀到結尾處的方法嗎??或是更適合c#的方法??有請各方高手解答,謝謝。

解决方案

解决方案二:
和发送方弄一个协议啊,完毕就发送一个特殊字符代表结束或者发送方在发送数据之前先发送一个数据的大小过来,然后在发送数据,接受方按照接收到的数据大小来定义什么时候算是发送完毕
解决方案三:
應該是client要配合server才對吧!!怎麼會讓server來配合client??每一個協議都有自已的標準吧,像是pop3、smtp、http...etc哪有說改就改的,而且權限也不在我阿...就算可以改,這樣子哪裡還叫編程阿??
解决方案四:
頂...
解决方案五:
我想應該無解也沒人知道吧..看來這篇又要石沉大海了
解决方案六:
不明白你的意思。Socket本来就要一直不停的接收,无所谓接收完成不完成。不知道你想要实现什么样的效果。你能说说吗?
解决方案七:
这么做是不对的.因为TCP无消息边界,ABC有可能是先收到AB,然后Available为0,过一会再收到C,所以你应该在发送前先传输文件长度,然后再等待,推荐用BinaryReader,这么用:br=newBinaryReader(NetworkStream);然后br.read(args);这样能解决消息边界问题

时间: 2024-09-12 06:04:30

使用 Socket.Receive 方法接收資料時要如何判斷資料已全部接收完畢??的相关文章

怎樣即時顯示該筆資料

问题描述 SqlDataSource_Orders.InsertParameters("客戶名稱").DefaultValue=LabelName.TextSqlDataSource_Orders.InsertParameters("客戶電話").DefaultValue=LabelTel.TextSqlDataSource_Orders.InsertParameters("客戶電郵").DefaultValue=LabelEmail.TextS

C# 网络编程之使用Socket类Send、Receive方法的同步通讯

      经过几天学习,终于解决了再C#网络编程中使用Socket类Send和Receive方法开发的客户端和服务端的同步通讯程序:实现了又客户端想服务器发送消息的界面程序.主要使用的方法是:      1.Socket套接字编程的知识,通过IPAddress定义一个IP地址,IPEndPoint定义一个主机,Socket实例套接字对象sock和线程Thread的的成员变量;      2.再调用方法bind绑定端口.listen监听端口.accept接受连接请求.connect请求连接来连接

使用socket的receive方法怎么会产生indexoutofrangeexception?

问题描述 各位大虾,我有一个问题,我使用socket的receive方法,如下:DimbytesAsInt32DimRecvBytes(1024)AsBytebytes=mSocket.Receive(RecvBytes,RecvBytes.Length,SocketFlags.None)注:msocket为socket类.有时候在msocket.receive方法是会发生indexoutofrangeexception,这是怎么回事 解决方案 解决方案二:我看了,receive方法应该不会触发

socket.Receive 堵塞问题

问题描述 publicForm1(){InitializeComponent();System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;intport=6678;listener=newTcpListener(port);listener.Start();Threadthread=newThread(newThreadStart(reControlCode));thread.Start();}privatevoidr

mfc-MFC单文档是socket编程方法

问题描述 MFC单文档是socket编程方法 我不知道recv函数应该放在什么地方,一接收数据就有问题,大神请指教 解决方案 recv函数最后在一个线程中,

c#Socket提示由于套接字没有连接并且没有提供地址,发送或接收数据的请求没有被接受。

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSyst

DatagramSocket.receive()方法无响应的解决

之前看网上说用发送命令行的方式获取客户端的mac地址,具体方法不复述了. 其中用到这个receive()方法,朋友在测试的时候发现会无响应,发现是window的系统防火墙开启以后出现的. 无法保证每个用户都是关闭系统防火墙的,所以看了一下api,发现一个解决方法. 直接贴代码看吧 [java] view plaincopyprint? DatagramSocket ds=new DatagramSocket();          DatagramPacket dpk = new Datagra

socket 读写方法是否能并行处理?

问题描述 socket 读写方法是否能并行处理?也就是说 wirte 和 read分别放在不同的线程里并行.这样可行不??? 问题补充:cuiran 写道 解决方案 线程分别读写的话,没什么问题,也不容易出现死锁的情况解决方案二:可以,一个线程负责读,一个线程负责写,如果缓冲区无数据,写线程等待解决方案三:nio里面的可以.

jms-Spring JMS接收消息的同时怎么给发送端发送回执说已经接收到消息

问题描述 Spring JMS接收消息的同时怎么给发送端发送回执说已经接收到消息 我想要在JMS接收到消息的时候告诉接收端已经接收到消息应该怎么做? 解决方案 这是你自己定义个通信协议的事,收到消息后向消息生产者发送自定义的收到消息就可以了,jms消息使用用下面代码实现1.消息发送 Java代码 复制代码//连接工厂 ConnectionFactory connFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_