Я пытаюсь перенести 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