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 GB,则我会有一个错误WSA_INVALID_PARAMETER -87

我该如何修复此操作,甚至可以这样做或寻找发送文件的其他选项?

根据Windows套接字错误代码,

wsa_invalid_parameter 87 一个或多个参数无效。 应用程序使用了Windows插座功能,该功能>直接映射到Windows功能。Windows>函数指示一个或多个参数的问题。请注意,此错误由>操作系统返回,因此错误号可能会在Windows的未来版本中更改。

我们只能猜测可能的无效参数。我们应该使用完整的文件路径。另请确保正确接收文件。要达到错误的根本原因,您必须捕获网络跟踪。首先通过添加配置条目并重现问题来启用跟踪,您应该得到一个详细的跟踪文件。我们可以阅读它以了解根本原因

编辑:

网络跟踪中没有太多详细信息,因此我查看了socket.sendfile实现的源代码。看来电话只是要去winsock transmitfile和此发送file抛出无效的参数错误。这是一个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();
                }

相关内容

  • 没有找到相关文章

最新更新