我的应用程序中有一个奇怪的错误:“每个套接字只使用一次”地址。我在tcpview中看到许多套接字处于CLOSE_WAIT状态。我设置了延迟超时。但这不管用。以下代码 服务器:
TcpListener listener = new TcpListener(IPAddress.Any, 7874);
TcpClient client;
listener.Start();
while (true)
{
client = listener.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(ThreadProc, client);
}
private static void ThreadProc(object obj)
{
var client = (TcpClient)obj;
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, new LingerOption(true, 0));
var stream = client.GetStream();
using(client){
using (MemoryStream ms = new MemoryStream())
{
int numBytesRead;
byte[] data = new byte[1024];
try
{
while ((numBytesRead = stream.Read(data, 0, data.Length)) > 0)
{
ms.Write(data, 0, numBytesRead);
}
}catch(Exception ex)
{}
var str = Encoding.ASCII.GetString(ms.ToArray(), 0, (int)ms.Length);
}
}
}
客户:
^{pr2}$但python客户端工作正常:
while True:
s = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((addr, 7874))
l_onoff = 1
l_linger = 0
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
struct.pack('ii', l_onoff, l_linger))
s.send(b'test')
while True:
data =s.recv(1024)
break
except Exception as ex:
print(str(datetime.datetime.now())+'NS FAIL')
finally:
s.close()
看起来像.NET tcpclient ignore set linger选项。结果与:
client.LingerState = new LingerOption(true, 0);
我认为你不需要设置延迟时间。我的猜测是,您不会在服务器端(接受的客户机)处理客户机套接字,然后它会在套接字堆栈中保持分配。在
相关问题 更多 >
编程相关推荐