从套接字读取网络流

时间:2012-01-24 15:12:31

标签: c# networkstream

我正在尝试从套接字读取网络流。我知道套接字的地址族是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();

我知道数据可用(我正在编写我自己的现有应用程序版本并使用源代码作为参考)但是真/假数据可用属性始终保持为false并且我从未点击过我的Console.Readline( )。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

我创建了一个简单的服务器应用程序并测试了您的客户端代码。这对我来说都很好。我建议你看看服务器代码,仔细检查它是否正在向客户端发送数据。您还可以使用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会不断返回错误。

希望这有帮助。