Files
linker/common.libs/extends/SocketExtends.cs
2024-05-30 16:21:11 +08:00

84 lines
2.7 KiB
C#

using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
namespace common.libs.extends
{
public static class SocketExtends
{
public static void WindowsUdpBug(this Socket socket)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
try
{
const uint IOC_IN = 0x80000000;
int IOC_VENDOR = 0x18000000;
int SIO_UDP_CONNRESET = (int)(IOC_IN | IOC_VENDOR | 12);
socket.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null);
}
catch (Exception)
{
}
}
}
public static void IPv6Only(this Socket socket, AddressFamily family, bool val)
{
if (NetworkHelper.IPv6Support && family == AddressFamily.InterNetworkV6)
{
try
{
socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, val);
}
catch (Exception)
{
}
}
}
public static void SafeClose(this Socket socket)
{
if (socket != null)
{
try
{
socket.Shutdown(SocketShutdown.Both);
//调试注释
socket.Disconnect(false);
}
catch (Exception)
{
}
finally
{
try
{
socket.Close();
}
catch (Exception)
{
}
}
}
}
public static void Reuse(this Socket socket, bool reuse = true)
{
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, reuse);
}
public static void ReuseBind(this Socket socket, IPEndPoint ip)
{
socket.Reuse(true);
socket.Bind(ip);
}
public static void KeepAlive(this Socket socket, int time = 60, int interval = 5, int retryCount = 5)
{
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveInterval, interval);
//socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveRetryCount, retryCount);
socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveTime, time);
}
}
}