TcpClient отправить / закрыть проблему - PullRequest
3 голосов
/ 04 февраля 2011

Нужно ли закрывать соединение, чтобы сообщения действительно отправлялись? Потому что, использую ли я команду send или сетевой поток, мои сообщения не обрабатываются, пока я не закрою соединение. Так должно быть или я что-то упустил?

Хорошо, вот код.

private void connectButton_Click(object sender, EventArgs e)
{
   try
   {
      client = new TcpClient();
      client.Connect(ip, port);
      netStream = client.GetStream();
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message);
   }
}

private void disconnectButton_Click(object sender, EventArgs e)
{
   if (client != null)
   {
      if (client.Connected)
      {
         client.Close();
         client = null;
      }
   }
}

private void sendButton_Click(object sender, EventArgs e)
{
   byte[] cmd = ToByteArray("bla bla bla");
   netStream.Write(cmd, 0, cmd.Length);
   netStream.Flush();
}

Я не думаю, что это связано с этим методом, но посмотрите.

public static byte[] ToByteArray(string str)
{
   System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
   return encoding.GetBytes(str);
}

Ответы [ 4 ]

1 голос
/ 04 февраля 2011

вы, вероятно, используете буферизованные потоки, попробуйте вызвать метод .Flush, который также автоматически вызывается при вызове clode.

0 голосов
/ 15 февраля 2011

Похоже, алгоритм Нейгла в действии.Попробуйте включить NoDelay параметр сокета, используя метод SetSocketOption .Но будьте осторожны, отключение алгоритма Nagle снизит пропускную способность.

0 голосов
/ 04 февраля 2011

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

Если вы хотите заблокировать запись данных, убедитесь, что вы используете BeginWrite , например:

void clientThread()
{
   writeStream.BeginWrite(buffer, 0, buffer.Length, myCallback, networkStream);
   resetEvent.WaitOne(timeout);
}
void myCallback(IAsyncResult ar)
{
   NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState;
   myNetworkStream.EndWrite(ar);
   resetEvent.Set();
}
0 голосов
/ 04 февраля 2011

Нет;они будут отправлены, возможно, с задержкой 200 мс.

Должно быть что-то еще не так.

...