mirror of
https://github.com/snltty/linker.git
synced 2025-09-27 21:42:18 +08:00
84 lines
2.7 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|