2012-01-24 70 views
1

我正在尝试从套接字读取网络流。我知道套接字的地址族是InterNetwork,套接字类型是流,协议类型是IP。从套接字读取网络流

我有一个IPEndPoint,它由IP地址和端口组成,我尝试从中读取。

NetworkStream myNetworkStream; 
Socket socket; 
IPEndPoint maxPort = new IPEndPoint(IPAddress.Parse("x.x.x.x"), xxxx); 

socket = 
    new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
socket.Connect(maxPort); 

myNetworkStream = new NetworkStream(socket); 

while (myNetworkStream.DataAvailable == false) 
{ 
    Thread.Sleep(1); 
} 

byte[] buffer = new byte[1024]; 
int offset = 0; 
int count = 1024; 

myNetworkStream.Read(buffer, offset, count); 

Console.ReadLine(); 

我知道数据是可用的(我写我自己的现有应用程序的版本和现在用的源代码作为参考),但真/假数据可用属性始终保持假的,我从来不打我到Console.ReadLine()。

我在这里做错了什么?

+0

此处的文档:http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.dataavailable.aspx使用do ... while循环。代码的结构表明您必须在检查DataAvailable属性之前尝试Read()。但我不是100%肯定的,但没有明确说明。它看起来像它正在检查你最后一次Read()的结果,以确定是否有数据返回。当然,我可能会离开基地。我从来没有遇到过这个问题,所以这只是一个猜测(这就是为什么它是一个评论,而不是一个答案) – David

+0

谢谢,虽然它挂在阅读,并没有进一步,但我很欣赏反馈!我会深入研究文档,因为我真的很喜欢这个问题,如果/当我弄明白的话,我会评论它!这是除非一些不错的开发人员在下面发布答案! – JMK

回答

2

我创建了一个简单的服务器应用程序,并测试了您的客户端代码。这一切对我来说都很好。我建议你看看服务器代码,仔细检查它是否正在向客户端发送数据。您还可以使用WireShark等数据包嗅探工具来验证数据是否正在传输。

这里是我的服务器代码:

IPEndPoint maxPort = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234); 
TcpListener listener = new TcpListener(maxPort); 
listener.Start(); 
Socket socket = listener.AcceptSocket(); 
socket.Send(new byte[] { 1, 2, 3, 4, 5 }); 
socket.Close(); 

如果您的服务器返回的数据,你可能要检查的TCP报头。问题可能是PSH位未被设置。这会导致TCP栈不能发出数据可用。我正在考虑这个事实,你说Read电话不会返回,DataAvailable不断返回false。

希望这会有所帮助。

+1

谢谢,原来我没有得到回应,因为我没有登录到设备!卫生署! – JMK