Использование KeepAlive опции для потоковых TCP сокетов

233
27 июня 2017, 21:13

Для установки KeepAlive опции я использую метод socket.IOControl:

[StructLayout(LayoutKind.Sequential)]
    struct TcpKeepAlive {
        public uint dwOnOff;
        public uint dwKeepAliveTime;
        public uint dwKeepAliveInterval;
    };
    private static void SetKeepAliveOption(Socket socket) {
        var tcpKeepAlive = new TcpKeepAlive()
        {
            dwOnOff = 5,
            dwKeepAliveInterval = 200,
            dwKeepAliveTime = 10000
        };
        var keepAlivePtr = IntPtr.Zero;
        int structSz = 0;
        structSz = Marshal.SizeOf(tcpKeepAlive);
        keepAlivePtr = Marshal.AllocHGlobal(structSz);
        Marshal.StructureToPtr(tcpKeepAlive, keepAlivePtr, true);
        byte[] structBytes = new byte[structSz];
        Marshal.Copy(keepAlivePtr, structBytes, 0, structSz);
        Marshal.FreeHGlobal(keepAlivePtr);
        socket.IOControl(IOControlCode.KeepAliveValues, structBytes, null);
    }

Создание сокета:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

Опцию устанавливаю до соединения (вроде как нельзя устанавливать опции для уже подключённых сокетов (Как тогда устанавливать опции для клиентов в socket.Listen методе?)).

Проблема следующая: Каким образом можно определить, что удалённая машина не доступна? Как определить результат использования опции? Ведь как-то она должна сообщать о результате проверок.

Что будет если у обоих клиентов будет включена эта опция? Будет ли такое соединения работать корректно?

READ ALSO
Не завершается процесс C#

Не завершается процесс C#

Имеется код, который должен завершать процесс, который был запущен из указанной папки:

237
Некорректно парсится дата

Некорректно парсится дата

У меня проблема с парсингом даты из строки в Datetime формат, когда я использую, напр01

267
Экспорт раздела реестра в файл

Экспорт раздела реестра в файл

Как экспортировать определенный раздел из реестра в файл "reg" ?

266