Sockets Socket.IOControl dotnet core Linux不工作

Sockets Socket.IOControl dotnet core Linux不工作,sockets,.net-core,keep-alive,notsupportedexception,Sockets,.net Core,Keep Alive,Notsupportedexception,我目前正在使用keepalive的服务器上工作 但它在dotnetcorelinux中不起作用 当我试着运行它时,我得到了一个 在dotnet core中实现keepalive是否有跨平台的替代方案 示例测试代码 private static void Main(字符串[]args) { Socket Socket=新套接字(SocketType.Stream,ProtocolType.Tcp); 绑定((端点)新IPEndPoint(IPAddress.Loopback,3178)); 听(1

我目前正在使用keepalive的服务器上工作 但它在dotnetcorelinux中不起作用 当我试着运行它时,我得到了一个

在dotnet core中实现keepalive是否有跨平台的替代方案

示例测试代码
private static void Main(字符串[]args)
{
Socket Socket=新套接字(SocketType.Stream,ProtocolType.Tcp);
绑定((端点)新IPEndPoint(IPAddress.Loopback,3178));
听(10);
WriteLine(“服务器:开始侦听”);
beginacept(新的异步回调(Program.AcceptCallback),(对象)套接字);
Console.WriteLine(“客户端:开始连接”);
TcpClient TcpClient=新的TcpClient();
tcpClient.Connect(新的IPEndPoint(IPAddress.Loopback,3178));
Console.WriteLine(“客户端:已连接”);
Console.WriteLine(“客户机:客户机keepAlive”);
Program.SetSocketKeepAliveValues(tcpClient.Client,1000,1);
睡眠(50);
控制台。写入线(“完成”);
Console.ReadLine();
}
私有静态void AcceptCallback(IAsyncResult ar)
{
Socket asyncState=ar.asyncState作为套接字;
尝试
{
套接字=asyncState.EndAccept(ar);
Console.WriteLine(“服务器:建立连接”);
WriteLine(“服务器:设置keepAlive”);
程序.SetSocketKeepAliveValues(套接字,1000,1);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
公共静态void SetSocketKeepAliveValues(套接字套接字、int-KeepAliveTime、int-KeepAliveInterval)
{
uint结构=0;
byte[]optionInValue=新字节[Marshal.SizeOf(结构)*3];
BitConverter.GetBytes(真?1U:0U).CopyTo((数组)选项值,0);
BitConverter.GetBytes((uint)KeepAliveTime).CopyTo((Array)optionInValue,Marshal.SizeOf(structure));
BitConverter.GetBytes((uint)KeepAliveInterval).CopyTo((数组)optionInValue,Marshal.SizeOf(结构)*2;
IOControl(IOControlCode.KeepAliveValues,optionInValue,(字节[])null);
}
提前感谢

[Edit]现在在Dotnet core中支持KeepAlive c代码

#include <netinet/in.h>
#include <netinet/tcp.h>
#define check(expr) if (!(expr)) { return 0; }

int enable_keepalive(int sock, int enable_keepalive,int time, int interval,int maxpkt) {
    check(setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &enable_keepalive, sizeof(int)) != -1);

    check(setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, &time, sizeof(int)) != -1);

    check(setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, &interval, sizeof(int)) != -1);

    check(setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, &maxpkt, sizeof(int)) != -1);
    return 1;
}
[DllImport("libname.so")]
public static extern int enable_keepalive(int sock, int enable_keepalive,int time, int interval,int maxpkt);

private static void Main(string[] args)
{
    TcpClient tcpClient = new TcpClient();
    tcpClient.Connect(new IPEndPoint(IPAddress.Loopback, 3178));
    Console.WriteLine("Client: Connected");
    Console.WriteLine("Client: Client keepAlive");
    Console.WriteLine(enable_keepalive((int)tcpClient.Client.Handle,1,10,5, 2));
}
基于此在ubuntu 16.04中测试

您可以使用
SetSocketOption

this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
this.socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
this.socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveInterval, 5);
this.socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveRetryCount, 16);

请发布SSCCE:。这里支持KeepAlive:SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.KeepAlive,true);启用keepalive,但间隔由操作系统管理,仅在.NetCore 3.0中可用+
this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
this.socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
this.socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveInterval, 5);
this.socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.TcpKeepAliveRetryCount, 16);