Почему при чтении сконфигурированного сокета TcpListener не получаются данные?

1

Я могу подключиться к сокету с помощью TcpListener, но я не могу читать данные. Я никогда не прохожу мимо проверки DataAvailable в следующем коде С# (обратите внимание, это резюме):

// Listen for a connection
m_host = "127.0.0.1";
int ListenerPort = 7777;
IPAddress localAddr = IPAddress.Parse(m_host);
TcpListener m_listener = new TcpListener(localAddr, ListenerPort);
m_listener.Start();
TcpClient m_client = m_listener.AcceptTcpClient();
if (m_client.Connected)
{      // We are connected.  Create a stream for handling the RX/TX messaging on the socket.
   NetworkStream clientStream = m_client.GetStream();
   if (clientStream.DataAvailable)
   {      // Read something
      byte[] message = new byte[14];
      int bytesRead = clientStream.Read(message, 0, 14);
   }
}

Нужно ли что-то нужно отправить обратно в сокет, прежде чем клиент узнает, что он может отправлять данные?

  • 0
    Ваш хост - это петлевой порт. Вы пытаетесь подключиться к себе?
  • 0
    Если вы ничего не отправите в сокет, ничего не будет получено.
Показать ещё 4 комментария
Теги:
sockets
tcplistener

1 ответ

0

Здесь происходит то, что вы создаете TcpListener (т.е. базовый сокет), принимаете соединение и сразу проверяете данные. Вероятно, клиент еще ничего не отправил, и вы оставите внешнее if-предложение, ничего не прочитав. В зависимости от того, что вы пытаетесь сделать, вы можете попробовать что-то вроде

if(m_client.Connected) 
{
    NetworkStream clientStream = m_client.GetStream();
    while(!m_client.DataAvailable) //be careful here - maybe introduce a timeout
    {}
    byte[] message = new byte[14];
    int bytesRead = clientStream.Read(message, 0, 14);
}

В любом случае, не зная, что именно вы пытаетесь сделать, я больше не могу вам помочь. Код может работать, но я бы предложил редизайн, поскольку из того, что я могу сказать по вашему фрагменту, ваш код страдает от плохого выбора дизайна (хотя это может возникнуть из вашего резюме).

  • 0
    Да, итоговый код, который я показал, был просто кратким. Код разработан в лучшей конструкции потоков. Я пытался спать, чтобы ждать данных.
  • 0
    Кроме того, клиентский код на самом деле является приложением VB6, но это не должно иметь значения, если сокет обрабатывается как сокет TCP. Я считаю, что клиент подключается к разъему AF_INET. Сокет на острой стороне C # использует адрес Family of InterNetwork. Я не знаю, будет ли это конфликтом.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню