Как получить fileno / filehandle сокета в C# (dotnetcore) - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь перенести python API на c#. Сам API использует API низкого уровня в C. Одна из функций принимает в качестве параметра дескриптор файла сокета.

Чтобы получить дескриптор файла, в python мы бы сделали так:

s = socket()
s.fileno()

Я пробовал следующее в c#:

(int)msock.SafeHandle.DangerousGetHandle()
//appears to be the same as
(int)msock.Handle

Однако из-за вызываемой функции я получаю неверный аргумент ошибки.

Возможно, это один из других аргументов, но я подозреваю, что сокет ...

Чтобы иметь представление о полном коде: Рабочий c код (c код используется python):

struct sockaddr_in inaddr;
struct in_addr in;
socklen_t addrlen;
if (inet_pton(AF_INET, ipstr, &in) != 1) {
        return PyErr_Format(PyExc_ValueError, "invalid IP address: %s", ipstr);
}
inaddr.sin_family = AF_INET;
inaddr.sin_addr.s_addr = in.s_addr;
inaddr.sin_port = htons(port);
addr = (struct sockaddr *)&inaddr;
addrlen = sizeof(inaddr);
maapi_connect(s, addr, addrlen); //The function I am interested

My C# код:

[StructLayout(LayoutKind.Sequential)]
public struct sockaddr_in
{
    public short sin_family;
    public ushort sin_port;
    public uint sin_addr;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public byte[] sin_zero;
};

Socket msock =  new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //TODO Support for IPv6 etc...
IPAddress ipa = IPAddress.Parse(ip);
sockaddr_in sin = new sockaddr_in()
{
    sin_family = libconfd_constants.AF_INET,
    sin_port = (ushort)IPAddress.HostToNetworkOrder((short)port),
#pragma warning disable 618
    sin_addr = (uint)ipa.Address,
#pragma warning restore 618
    sin_zero = new byte[8] { 0, 0, 0, 0, 0, 0, 0, 0 }
};
int alen  = Marshal.SizeOf(typeof(sockaddr_in));
var r = libconfd_bindings.maapi_connect((int)msock.SafeHandle.DangerousGetHandle(), sin, alen);

Есть идеи? Изменить: я забыл упомянуть, это сделать ядро ​​tnet, я делаю это на моей ма c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...