У меня есть простая программа чата tcp / ip с сервером и клиентом. В первый раз, когда я отправляю пакет, он передается клиенту, но во время NetworkStream.Read останавливает выполнение и не выдает исключение. Следующий отправленный мной пакет отлично читается и обрабатывается. Еще одна странная вещь, которую я заметил, заключается в том, что MyNetworkStream.DataAvailable всегда ложно, даже если я получаю информацию с сервера, поэтому мне нужно поставить символ отладки и пропустить его. Я хотел бы опубликовать весь свой код, но это долго, поэтому я буду публиковать там, где я читаю и пишу в сетевой поток.
public void Listen(int byteLength)
{
var buffer = new byte[byteLength];
MySocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Read), buffer);
}
private void Read(IAsyncResult ar)
{
while (MySocket.Connected)
{
MyNetworkStream = new NetworkStream(MySocket);
var buffer = new byte[((byte[])ar.AsyncState).Length];
if (!MyNetworkStream.DataAvailable)
throw new Exception("Data not available");
MyNetworkStream.Read(buffer, 0, buffer.Length); <------Here it stops execution without throwing an exception
string content = Encoding.ASCII.GetString(buffer);
if(OnRead == null)
continue;
var e = new CommandEventArgs( null, content);
Control target = null;
if (OnRead.Target is Control)
target = (Control)OnRead.Target;
if (target != null && target.InvokeRequired)
target.Invoke(OnRead, this, e);
else
OnRead(this,e);
}
}
public void Write(string message)
{
try
{
var buffer = Encoding.ASCII.GetBytes(message);
MySocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, null, null);
if (OnWrite != null)
{
var target = (Control)OnWrite.Target;
if (target != null && target.InvokeRequired)
{
target.Invoke(OnWrite, this, new EventArgs());
}
else
{
OnWrite(this, new EventArgs());
}
}
}
catch
{
}
}