Socket.send () висит / спит на сервере - PullRequest
1 голос
/ 23 мая 2011

У меня есть этот метод, который я использую для отправки объекта Transfer

        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");
    }

Странно то, что он работает первые 2 раза, когда я его вызываю, затем при 3-м вызове он зависает на s.send ().

То же самое, если я хочу отправить строку вместо передачи.

1 Ответ

0 голосов
/ 23 мая 2011

Комментарий @nos, вероятно, правильный, буфер отправки TCP, вероятно, заполняется, и 3-й вызов s.send () блокируется, пока данные не будут отправлены по сети.Вы можете установить размер используемого буфера следующим образом:

Socket s = sockListener.Accept();
s.ReceiveBufferSize = 1024 * 64;
s.SendBufferSize = 1024 * 64;

Вы сможете подтвердить свою проблему, установив размер буфера, кратный размеру данных, которые вы отправляете.

Также, как предлагается, вы должны проверить клиент, чтобы убедиться, что он правильно читает данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...