将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);
}