Читать сетевой поток из сокета - PullRequest
2 голосов
/ 24 января 2012

Я пытаюсь прочитать сетевой поток из сокета.Я знаю, что семейство адресов сокета является межсетевым, тип сокета - потоковым, а тип протокола - 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();

Я знаю, что данные доступны (я пишу свою собственную версию существующего приложения и использую исходный код в качестве ссылки), но свойство Доступные данные true / false всегда остается ложным, и я никогданажми на Console.Readline ().

Что я тут не так делаю?

1 Ответ

3 голосов
/ 24 января 2012

Я создал простое серверное приложение и проверил ваш клиентский код.У меня все отлично работает.Я бы посоветовал вам взглянуть на код сервера, чтобы дважды проверить, что он отправляет данные клиенту.Вы также можете использовать инструмент анализа пакетов, такой как 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.

Надеюсь, это поможет.

...