TCPClient“每个套接字地址和延迟选项只能使用一次

2024-04-26 15:00:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我的应用程序中有一个奇怪的错误:“每个套接字只使用一次”地址。我在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);

Tags: clienttrueobjnewdatavarsocketms
1条回答
网友
1楼 · 发布于 2024-04-26 15:00:39

我认为你不需要设置延迟时间。我的猜测是,您不会在服务器端(接受的客户机)处理客户机套接字,然后它会在套接字堆栈中保持分配。在

相关问题 更多 >