Socket.SendFile отправить ошибку большого файла 87

Я использую стандартный метод отправки файла.

internal bool SendToServer(string filename)
    {

        if (null == _netSocket || !_netSocket.Connected) CreateSocketConnect();

        try
        {

            _netSocket.SendFile(filename);

            File.Delete(filename);

            return true;
        }
        catch (SocketException ex)
        {
            CloseSocketConnect();
            string error = string.Format("exception: {0} error code: {1} stacktrace: {2}", ex.Message, ex.ErrorCode, ex.StackTrace);
            _twriter.AddMessage(string.Format("-> {0}", error));
            Logger.Instance.WriteLine(ex.Message);
        }

        return false;
    }

Но есть одна проблема. Если файл большой, больше 1,5 ГБ, то я получаю сообщение об ошибке WSA_INVALID_PARAMETER - 87

Как я могу это исправить и могу ли я даже сделать это или искать другой вариант для отправки файла?

1 ответ

Согласно кодам ошибок Windows Socket,

WSA_INVALID_PARAMETER 87 Один или несколько параметров недопустимы. Приложение использовало функцию Windows Sockets, которая> напрямую сопоставляется с функцией Windows. Функция Windows> указывает на проблему с одним или несколькими> параметрами. Обратите внимание, что эта ошибка возвращается> операционной системой, поэтому номер ошибки может измениться в> будущих выпусках Windows.

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

Редактировать:

В трассировке сети не так много деталей, поэтому я посмотрел исходный код реализации Socket.SendFile. Похоже, что вызов просто идет в WinSock TransmitFile, и этот TransmitFile выдает ошибку недопустимого параметра. Так что это ошибка winsock, здесь происходит событие Winsock PInvoke

// This can throw ObjectDisposedException.
                if (fileHandle != null ?
                    !UnsafeNclNativeMethods.OSSOCK.TransmitFile_Blocking(m_Handle.DangerousGetHandle(), fileHandle, 0, 0, SafeNativeOverlapped.Zero, asyncResult.TransmitFileBuffers, flags) :
                    !UnsafeNclNativeMethods.OSSOCK.TransmitFile_Blocking2(m_Handle.DangerousGetHandle(), IntPtr.Zero, 0, 0, SafeNativeOverlapped.Zero, asyncResult.TransmitFileBuffers, flags))
                {
                    errorCode = (SocketError) Marshal.GetLastWin32Error();
                }
Другие вопросы по тегам