Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 如何找出我应该从插座读取多少?_Silverlight_Sockets_Network Programming - Fatal编程技术网

Silverlight 如何找出我应该从插座读取多少?

Silverlight 如何找出我应该从插座读取多少?,silverlight,sockets,network-programming,Silverlight,Sockets,Network Programming,在.NET中,网络流中有DataAvailable属性,tcp客户端中有Available属性。 然而silverlight缺少这些。 我应该发送带有消息长度的标题吗?我宁愿不要浪费网络资源。 还有别的办法吗?你说的“浪费网络资源”是什么意思?我知道的每个网络读取API都会以某种方式返回实际读取的字节数。这里的实际问题是什么?你所说的“浪费网络资源”是什么意思?我知道的每个网络读取API都会以某种方式返回实际读取的字节数。这里的实际问题是什么?您正在进行微优化。为什么您认为另外4个字节会影响性能

在.NET中,网络流中有DataAvailable属性,tcp客户端中有Available属性。
然而silverlight缺少这些。 我应该发送带有消息长度的标题吗?我宁愿不要浪费网络资源。

还有别的办法吗?

你说的“浪费网络资源”是什么意思?我知道的每个网络读取API都会以某种方式返回实际读取的字节数。这里的实际问题是什么?

你所说的“浪费网络资源”是什么意思?我知道的每个网络读取API都会以某种方式返回实际读取的字节数。这里的实际问题是什么?

您正在进行微优化。为什么您认为另外4个字节会影响性能

换句话说:使用长度标题

更新 我看到你对另一个答案的评论。您正在以错误的方式使用
BeginRead
。它永远不会阻塞或等待整个缓冲区被填满

您应该声明一个可以接收整个消息的缓冲区。
EndRead
的返回值将报告接收到的字节数

您还应该知道TCP是基于流的。没有保证您的整个JSON消息将立即被接收(或者只接收到您的第一条消息)。因此,您必须有某种方式知道消息何时完成


我再说一遍:长度标题几乎不会影响性能。

您正在进行微优化。为什么您认为另外4个字节会影响性能

换句话说:使用长度标题

更新 我看到你对另一个答案的评论。您正在以错误的方式使用
BeginRead
。它永远不会阻塞或等待整个缓冲区被填满

您应该声明一个可以接收整个消息的缓冲区。
EndRead
的返回值将报告接收到的字节数

您还应该知道TCP是基于流的。没有保证您的整个JSON消息将立即被接收(或者只接收到您的第一条消息)。因此,您必须有某种方式知道消息何时完成



我再说一遍:长度标题几乎不会影响性能。

在我的情况下,它们可能会影响性能。我可能会延迟其他更重要的网络事件。TCP头在20到60字节之间。你得到了Nagle算法来延迟你的数据包。我严重怀疑4字节是否会影响性能。如果您有较小的数据包,请使用
字节
,或
Int16
来减少字节数。@jgauffin:好吧,我是在用高压IP。我需要使用尽可能少的带宽。平均消息有多大?这些消息包含哪些内容?您可能需要调用
BeginReceive
两次才能获取全部15个字节。TCP仅保证所有内容都将以正确的顺序接收。并不是说所有的东西都会被接收到,并且对
Receive
的调用次数与对
Send
的调用次数相同。在我的情况下,它们可能会。我可能会延迟其他更重要的网络事件。TCP头在20到60字节之间。你得到了Nagle算法来延迟你的数据包。我严重怀疑4字节是否会影响性能。如果您有较小的数据包,请使用
字节
,或
Int16
来减少字节数。@jgauffin:好吧,我是在用高压IP。我需要使用尽可能少的带宽。平均消息有多大?这些消息包含哪些内容?您可能需要调用
BeginReceive
两次才能获取全部15个字节。TCP仅保证所有内容都将以正确的顺序接收。并不是说所有的东西都将以与发送的呼叫数相同的呼叫数接收。Silverlight是非阻塞的。我想在阅读任何东西之前检查一下我是否应该阅读,以及应该阅读多少。@the_-drow,无论它是阻塞还是非阻塞,都没有任何区别。read API将告诉您它读取了多少。@EJP:True,但调用仍将占用套接字,这有点浪费。@drow完全没有意义。浪费怎么办?非阻塞就是非阻塞。时期如果您想知道是否要读取非阻塞套接字,这就是select()的作用。@EJP:为什么要使用DataAvailable和Available?我是这样使用它的:
if(stream.Available){byte[]buffer=new byte[tcpClient.Available];stream.BeginRead(buffer,0,buffer.Length,callback,null);}
Silverlight是非阻塞的。我想在阅读任何东西之前检查一下我是否应该阅读,以及应该阅读多少。@the_-drow,无论它是阻塞还是非阻塞,都没有任何区别。read API将告诉您它读取了多少。@EJP:True,但调用仍将占用套接字,这有点浪费。@drow完全没有意义。浪费怎么办?非阻塞就是非阻塞。时期如果您想知道是否要读取非阻塞套接字,这就是select()的作用。@EJP:为什么要使用DataAvailable和Available?我是这样使用它的:
if(stream.Available){byte[]buffer=new byte[tcpClient.Available];stream.BeginRead(buffer,0,buffer.Length,callback,null);}