我正在尝试从套接字读取网络流。我知道套接字的地址族是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( )。
我在这里做错了什么?
答案 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
会不断返回错误。
希望这有帮助。