调用示例:
Socket socket = new Socket(AF_INET, SOCK_STREAM, 0);
1: socket.SetFastOpen();
2: SetFastOpen(socket);
函数实现
#if NETCOREAPP
[MethodImpl(MethodImplOptions.AggressiveInlining)]
#endif
public static bool SetFastOpen(this Socket socket, bool fastOpen = true)
{
if (SocketExtension.CleanedUp(socket) || socket.ProtocolType != ProtocolType.Tcp)
{
return false; // https://github.com/dotnet/runtime/issues/1476#issue-547173361
}
PlatformID platform = Environments.Platform;
if (platform == PlatformID.Win32NT)
{
// #define TCP_FASTOPEN 15
try
{
socket.SetSocketOption(SocketOptionLevel.Tcp, (SocketOptionName)15, fastOpen);
return true;
}
catch
{
return false;
}
}
else if (platform == PlatformID.Unix)
{
// #define TCP_FASTOPEN 23 /* Enable FastOpen on listeners */
// #define SOL_TCP 6 /* TCP level */
int v = fastOpen ? 1 : 0;
int r = NativeMethods.linux_setsockopt(socket.Handle.ToInt32(), 6, 23,
(IntPtr)(&v), sizeof(int));
return r == 0;
}
else
{
return false;
}
}
外部函数:
[DllImport("libc", EntryPoint = "setsockopt", CallingConvention = CallingConvention.Cdecl)]
public static extern int linux_setsockopt(int socket, int level, int option_name, IntPtr option_value, int option_len);