将 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# 中做同样的事情...

提前谢谢你..

将 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# 字符是否兼容类型?