C# Socket.send()在服务器中挂起/休眠

C# Socket.send()在服务器中挂起/休眠,c#,sockets,client-server,C#,Sockets,Client Server,我使用这个方法发送一个传输对象 IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 7777); Socket sockListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); sockListener.SetSocketOption(SocketOptionLevel.Socket, S

我使用这个方法发送一个传输对象

        IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 7777);
        Socket sockListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        sockListener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        sockListener.Bind(ipEnd);
        sockListener.Listen(100);


        s = sockListener.Accept();

private void sendToClient(Transfer.Transfer tt)
    {
        byte[] buffer = new byte[15000];

        IFormatter f = new BinaryFormatter();
        Stream stream = new MemoryStream(buffer);
        f.Serialize(stream, tt);
        Console.WriteLine("1/3 serialized");
        stream.Flush();
        Console.WriteLine("2/3 flushed stream");
        s.Send(buffer, buffer.Length, 0);
        Console.WriteLine("3/3 send to client");
    }
奇怪的是,在我第一次呼叫它时,它工作了两次,然后在第三次呼叫时,它挂在s.send上


如果我想发送字符串而不是传输,这是一样的。

@nos的注释可能是正确的,TCP发送缓冲区可能已满,对s.send的第三次调用正在阻塞,直到数据通过网络发送。您可以如下设置使用的缓冲区大小:

Socket s = sockListener.Accept();
s.ReceiveBufferSize = 1024 * 64;
s.SendBufferSize = 1024 * 64;
您应该能够通过将缓冲区大小设置为发送数据大小的更大倍数来确认问题


此外,正如建议的那样,您应该检查客户机以确保其正确读取数据。

也许您的客户机没有读取您发送给它的内容,在这种情况下,随着各种缓冲区的填满,服务器最终会阻塞。