将 C 转换为 C#
本文关键字:转换 | 更新日期: 2023-09-27 18:18:02
可能的重复项:
将 C 转换为 C#
我在将 C 代码转换为 C# 时遇到问题我有两个结构器
struct sockaddr {
ushort sa_family;
char sa_data[14];
};
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
我曾经这样投射它...以获取 IP 地址。从sockaddr_in结构
ip = inet_ntoa((( sockaddr_in*)name)->sin_addr);
现在我将 C# 中的结构转换为
public struct sockaddr
{
public static ushort sa_family;
public static char[] sa_data = new char[14];
};
和。。
[StructLayout(LayoutKind.Sequential, Size = 16)]
public struct sockaddr_in
{
public const int Size = 16;
public short sin_family;
public ushort sin_port;
public struct in_addr
{
public uint S_addr;
public struct _S_un_b
{
public byte s_b1, s_b2, s_b3, s_b4;
}
public _S_un_b S_un_b;
public struct _S_un_w
{
public ushort s_w1, s_w2;
}
public _S_un_w S_un_w;
}
public in_addr sin_addr;
}
任何人都可以帮我从将 Sockaddr 转换为 sockaddr_in 中获取 IP 地址,因为我在 C 中尝试过它...... 它工作正常...如何在 C# 中做同样的事情...
提前谢谢你..
这是一个
低级套接字连接,但Microsoft将您需要的所有内容包装在名为HttpWebRequest和HttpWebResponse的两个类中,这两个类位于 System.Net 命名空间中。
private Socket m_socket = null;
internal void Connect()
{
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint remoteEP = new IPEndPoint(Dns.Resolve(this.EndPointUri.Host).AddressList[0], EndPointUri.Port);
m_socket.Connect(remoteEP);
m_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 60 * 1000);
m_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 60 * 1000);
}
你尝试实现的目标在 C# 中当然是可能的。下面是一个示例:
[StructLayout(LayoutKind.Sequential)]
unsafe struct SockAddr {
public ushort sa_family;
public fixed byte sa_data[14]; // Note: sizeof(char) == 2 in C#
}
[StructLayout(LayoutKind.Sequential)]
unsafe struct SockAddr_In {
public short sin_family;
public ushort sin_port;
public In_Addr sin_addr;
public fixed byte sin_zero[8];
}
[StructLayout(LayoutKind.Sequential)]
struct In_Addr {
public byte s_b1, s_b2, s_b3, s_b4;
}
public static unsafe void CStyle() {
SockAddr s;
SockAddr* ps = &s;
SockAddr_In* psa = (SockAddr_In*)ps;
var inAddr = new In_Addr();
inAddr.s_b1 = 192;
inAddr.s_b2 = 168;
inAddr.s_b3 = 168;
inAddr.s_b4 = 56;
psa->sin_addr = inAddr;
Console.WriteLine("{0}.{1}.{2}.{3}",
psa->sin_addr.s_b1, psa->sin_addr.s_b2,
psa->sin_addr.s_b3, psa->sin_addr.s_b4);
}
但是,正如其他人所指出的那样,此类方法会导致非惯用的 C# 代码,通常不能推荐使用。
你在这里做的称为封送。
您可能需要向结构添加一些提示,以确保正确封送。(C++字符和 C# 字符是否兼容类型?