【发布时间】:2014-07-28 11:28:20
【问题描述】:
我在使用 C# TcpClient 发送数据时遇到问题。
这就是我的代码的样子:
public Connection()
{
try
{
client = new TcpClient("127.0.0.1", 7171);
writer = new StreamWriter(client.GetStream());
client.Client.NoDelay = true;
client.NoDelay = true;
sendFirstPacket();
while (true)
{
if (client.GetStream().DataAvailable)
Logger.log(Log_Type.ERROR, "mam cos");
}
Logger.log(Log_Type.INFO, "Spoko luz");
}
catch (Exception ex)
{
Logger.log(Log_Type.ERROR, ex.Message);
}
finally
{
//client.Close();
}
}
void onSendDone()
{
}
void sendFirstPacket()
{
writer.Write((byte)10);
writer.Write((ushort)2);
writer.Write((ushort)854);
UInt32[] k = new UInt32[4];
k[0] = (12444 << 16) | 12444;
k[1] = (12444 << 16) | 12444;
k[2] = (12444 << 16) | 12444;
k[3] = (12444 << 16) | 12444;
writer.Write((byte)0); // first byte have to be 0
writer.Write((UInt32)k[0]);
writer.Write((UInt32)k[1]);
writer.Write((UInt32)k[2]);
writer.Write((UInt32)k[3]);
writer.Flush();
//client.GetStream().Write(
}
不幸的是,几秒钟后,我的服务器上出现“由于线程退出或应用程序请求而中止 i/o 操作”(用 C++ 编写)。 但是,如果我更改此代码,并将 sendFirstPakcet() 放入 while 循环,它将正确发送数据包(我计数超过 700 个循环),然后抛出异常:无法将数据写入传输连接:现有连接被强行关闭远程主机。
public Connection()
{
try
{
client = new TcpClient("127.0.0.1", 7171);
writer = new StreamWriter(client.GetStream());
client.Client.NoDelay = true;
client.NoDelay = true;
sendFirstPacket();
while (true)
{
if (client.GetStream().DataAvailable)
Logger.log(Log_Type.ERROR, "mam cos");
sendFirstPacket();
}
Logger.log(Log_Type.INFO, "Spoko luz");
}
catch (Exception ex)
{
Logger.log(Log_Type.ERROR, ex.Message);
}
finally
{
//client.Close();
}
}
void onSendDone()
{
}
void sendFirstPacket()
{
writer.Write((byte)10);
writer.Write((ushort)2);
writer.Write((ushort)854);
UInt32[] k = new UInt32[4];
k[0] = (12444 << 16) | 12444;
k[1] = (12444 << 16) | 12444;
k[2] = (12444 << 16) | 12444;
k[3] = (12444 << 16) | 12444;
writer.Write((byte)0); // first byte have to be 0
writer.Write((UInt32)k[0]);
writer.Write((UInt32)k[1]);
writer.Write((UInt32)k[2]);
writer.Write((UInt32)k[3]);
writer.Flush();
//client.GetStream().Write(
}
这可能是什么原因?
【问题讨论】: