将C转换为C#

将C转换为C#,c#,c,casting,struct,C#,C,Casting,Struct,可能重复: 我在用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]; }; 我过去常常这样投。。。 获

可能重复:

我在用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_

 ip = inet_ntoa((( sockaddr_in*)name)->sin_addr); 
现在我将结构转换为c#as

任何一个plz可以帮助我获得ip地址从铸造sockaddr到sockaddr_在我尝试在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++类型和C++类型的兼容类型等)

你尝试实现的是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,您将错过很多C功能。在本例中,C#有自己的套接字处理类在C和C#之间传递这些结构的原因是什么?C#具有内置的网络类。如果这是切换到C#的方式,我建议将其保留在C中,并用作非托管代码。使用这种方法,在C#中实现它将一无所获。顺便说一句,您试图实现的是将字符串解析为ushort和in_addr吗?解决问题的方法当然不是这样做,而是使用.net库。如果你真的想写C,那么就写C。在一个相关的注释上:有人能帮我把Java转换成Javascript吗?这应该是一个注释。它不能回答这个问题。@DavidHeffernan有时候你不需要答案,你只需要知道去哪里找。不管怎样,因为你完全正确+1适合你:D
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);
}
[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);
}