Как узнать, когда закрывать сокет при работе с HTTP-клиентами? - PullRequest
1 голос
/ 16 апреля 2010

Как узнать, когда закрывать сокет HTTP-клиента (я имею в виду, что браузер подключается к моему серверу сокетов TCP). Все работает отлично, но в другом случае для браузера, чтобы показать, что сервер отправил, я должен выключить сервер (или вызвать socket.Close ()).

Это нормально работает, если я позвоню (socket.Close ()), но я просто не знаю, когда. Я не хочу вызывать close в середине запроса, иначе браузеру придется перезагрузиться, чтобы снова подключиться к серверу.

Ответы [ 2 ]

3 голосов
/ 16 апреля 2010

Вам необходимо закрыть свой конец сокета, чтобы клиент знал, что данных больше не будет. Вам также необходимо прочитать все ожидающие данные, потому что, если вы сразу же вызовете Close(), клиент получит сброс (TCP RST).

С помощью приведенного выше кода, как только клиент закроет свой конец или истечет указанное вами время ожидания, соединение будет окончательно закрыто на нашем конце.

То, что я делал давным-давно, было так (для сервера Mono ASP.NET ):

    void LingeringClose ()
    {
        int waited = 0;

        if (!Connected)
            return;

        try {
            Socket.Shutdown (SocketShutdown.Send);
            DateTime start = DateTime.UtcNow;
            while (waited < max_useconds_to_linger) {
                int nread = 0;
                try {
                    if (!Socket.Poll (useconds_to_linger, SelectMode.SelectRead))
                        break;

                    if (buffer == null)
                        buffer = new byte [512];

                    nread = Socket.Receive (buffer, 0, buffer.Length, 0);
                } catch { }

                if (nread == 0)
                    break;

                waited += (int) (DateTime.UtcNow - start).TotalMilliseconds * 1000;
            }
        } catch {
            // ignore - we don't care, we're closing anyway
        }
    }
1 голос
/ 16 апреля 2010

HTTP - довольно сложный протокол. RFC 2616 (который вы должны прочитать, если вы используете HTTP-сервер) определяет версию 1.1 и конкретно говорит об обработке соединений в разделе 8.

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