如何将C++中的SOCKADDR_IN*参数类型转换成C#中的参数类型

将C++中的参数类型SOCKADDR_IN*映射为C#中的IntPtr参数类型的示例代码如下:

IntPtr ptrSockaddr = new IntPtr();
 
//ip地址
sockaddr_in sockaddr = new sockaddr_in();
sockaddr.sin_family = ADDRESS_FAMILIES.AF_INET;
sockaddr.sin_port = Ws232Util.htons(port);
sockaddr.sin_addr.s_addr = Ws232Util.inet_addr(host);
sockaddr.sin_zero = new byte[8] { 0, 0, 0, 0, 0, 0, 0, 0 };
ptrSockaddr = Marshal.AllocHGlobal(Marshal.SizeOf(sockaddr));
Marshal.StructureToPtr(sockaddr, ptrSockaddr, false);

然后将ptrSockaddr参数传入相应的方法中即可。

sockaddr_in在C#中的完整定义如下:

1、ADDRESS_FAMILIES.cs

using System;
 
namespace DiancaiBll
{
    public enum ADDRESS_FAMILIES : short
    {
        /// <summary>
        /// Unspecified [value = 0].
        /// </summary>
        AF_UNSPEC = 0,
        /// <summary>
        /// Local to host (pipes, portals) [value = 1].
        /// </summary>
        AF_UNIX = 1,
        /// <summary>
        /// Internetwork: UDP, TCP, etc [value = 2].
        /// </summary>
        AF_INET = 2,
        /// <summary>
        /// Arpanet imp addresses [value = 3].
        /// </summary>
        AF_IMPLINK = 3,
        /// <summary>
        /// Pup protocols: e.g. BSP [value = 4].
        /// </summary>
        AF_PUP = 4,
        /// <summary>
        /// Mit CHAOS protocols [value = 5].
        /// </summary>
        AF_CHAOS = 5,
        /// <summary>
        /// XEROX NS protocols [value = 6].
        /// </summary>
        AF_NS = 6,
        /// <summary>
        /// IPX protocols: IPX, SPX, etc [value = 6].
        /// </summary>
        AF_IPX = 6,
        /// <summary>
        /// ISO protocols [value = 7].
        /// </summary>
        AF_ISO = 7,
        /// <summary>
        /// OSI is ISO [value = 7].
        /// </summary>
        AF_OSI = 7,
        /// <summary>
        /// european computer manufacturers [value = 8].
        /// </summary>
        AF_ECMA = 8,
        /// <summary>
        /// datakit protocols [value = 9].
        /// </summary>
        AF_DATAKIT = 9,
        /// <summary>
        /// CCITT protocols, X.25 etc [value = 10].
        /// </summary>
        AF_CCITT = 10,
        /// <summary>
        /// IBM SNA [value = 11].
        /// </summary>
        AF_SNA = 11,
        /// <summary>
        /// DECnet [value = 12].
        /// </summary>
        AF_DECnet = 12,
        /// <summary>
        /// Direct data link interface [value = 13].
        /// </summary>
        AF_DLI = 13,
        /// <summary>
        /// LAT [value = 14].
        /// </summary>
        AF_LAT = 14,
        /// <summary>
        /// NSC Hyperchannel [value = 15].
        /// </summary>
        AF_HYLINK = 15,
        /// <summary>
        /// AppleTalk [value = 16].
        /// </summary>
        AF_APPLETALK = 16,
        /// <summary>
        /// NetBios-style addresses [value = 17].
        /// </summary>
        AF_NETBIOS = 17,
        /// <summary>
        /// VoiceView [value = 18].
        /// </summary>
        AF_VOICEVIEW = 18,
        /// <summary>
        /// Protocols from Firefox [value = 19].
        /// </summary>
        AF_FIREFOX = 19,
        /// <summary>
        /// Somebody is using this! [value = 20].
        /// </summary>
        AF_UNKNOWN1 = 20,
        /// <summary>
        /// Banyan [value = 21].
        /// </summary>
        AF_BAN = 21,
        /// <summary>
        /// Native ATM Services [value = 22].
        /// </summary>
        AF_ATM = 22,
        /// <summary>
        /// Internetwork Version 6 [value = 23].
        /// </summary>
        AF_INET6 = 23,
        /// <summary>
        /// Microsoft Wolfpack [value = 24].
        /// </summary>
        AF_CLUSTER = 24,
        /// <summary>
        /// IEEE 1284.4 WG AF [value = 25].
        /// </summary>
        AF_12844 = 25,
        /// <summary>
        /// IrDA [value = 26].
        /// </summary>
        AF_IRDA = 26,
        /// <summary>
        /// Network Designers OSI & gateway enabled protocols [value = 28].
        /// </summary>
        AF_NETDES = 28,
        /// <summary>
        /// [value = 29].
        /// </summary>
        AF_TCNPROCESS = 29,
        /// <summary>
        /// [value = 30].
        /// </summary>
        AF_TCNMESSAGE = 30,
        /// <summary>
        /// [value = 31].
        /// </summary>
        AF_ICLFXBM = 31
    }
}

2、in_addr.cs

using System;
using System.Runtime.InteropServices;
 
namespace DiancaiBll
{
    [StructLayout(LayoutKind.Explicit, Size = 4)]
    public struct in_addr
    {
        [FieldOffset(0)]
        internal byte s_b1;
        [FieldOffset(1)]
        internal byte s_b2;
        [FieldOffset(2)]
        internal byte s_b3;
        [FieldOffset(3)]
        internal byte s_b4;
 
        [FieldOffset(0)]
        internal ushort s_w1;
        [FieldOffset(2)]
        internal ushort s_w2;
 
        [FieldOffset(0)]
        internal uint S_addr;
 
        /// <summary>
        /// can be used for most tcp & ip code
        /// </summary>
        public uint s_addr
        {
            get { return S_addr; }
            set { S_addr = value; }
        }
 
        /// <summary>
        /// host on imp
        /// </summary>
        public byte s_host
        {
            get { return s_b2; }
            set { s_b2 = value; }
        }
 
        /// <summary>
        /// network
        /// </summary>
        public byte s_net
        {
            get { return s_b1; }
            set { s_b1 = value; }
        }
 
        /// <summary>
        /// imp
        /// </summary>
        public ushort s_imp
        {
            get { return s_w2; }
            set { s_w2 = value; }
        }
 
        /// <summary>
        /// imp #
        /// </summary>
        public byte s_impno
        {
            get { return s_b4; }
            set { s_b4 = value; }
        }
 
        /// <summary>
        /// logical host
        /// </summary>
        public byte s_lh
        {
            get { return s_b3; }
            set { s_b3 = value; }
        }
    }
}

3、in6_addr.cs

using System;
using System.Runtime.InteropServices;
 
namespace DiancaiBll
{
    [StructLayout(LayoutKind.Explicit, Size = 16)]
    public struct in6_addr
    {
        [FieldOffset(0)]
        public byte Byte_0;
        [FieldOffset(1)]
        public byte Byte_1;
        [FieldOffset(2)]
        public byte Byte_2;
        [FieldOffset(3)]
        public byte Byte_3;
 
        [FieldOffset(4)]
        public byte Byte_4;
        [FieldOffset(5)]
        public byte Byte_5;
        [FieldOffset(6)]
        public byte Byte_6;
        [FieldOffset(7)]
        public byte Byte_7;
 
        [FieldOffset(8)]
        public byte Byte_8;
        [FieldOffset(9)]
        public byte Byte_9;
        [FieldOffset(10)]
        public byte Byte_10;
        [FieldOffset(11)]
        public byte Byte_11;
 
        [FieldOffset(12)]
        public byte Byte_12;
        [FieldOffset(13)]
        public byte Byte_13;
        [FieldOffset(14)]
        public byte Byte_14;
        [FieldOffset(15)]
        public byte Byte_16;
 
        [FieldOffset(0)]
        public short Word_0;
        [FieldOffset(2)]
        public short Word_1;
        [FieldOffset(4)]
        public short Word_2;
        [FieldOffset(6)]
        public short Word_3;
 
        [FieldOffset(8)]
        public short Word_4;
        [FieldOffset(10)]
        public short Word_5;
        [FieldOffset(12)]
        public short Word_6;
        [FieldOffset(14)]
        public short Word_7;
    }
}

4、sockaddr_in.cs

using System;
using System.Text;
using System.Runtime.InteropServices;
 
namespace DiancaiBll
{
    [StructLayout(LayoutKind.Sequential)]
    public struct sockaddr_in
    {
        public ADDRESS_FAMILIES sin_family;
        public ushort sin_port;
        public in_addr sin_addr;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public byte[] sin_zero;
 
        public string Host
        {
            get
            {
                sockaddr_in local = this;
                uint length = 256;
                StringBuilder builder = new StringBuilder((int)length);
 
                WSAData data = new WSAData();
                Ws232Util.WSAStartup(2, ref data);
                Ws232Util.WSAAddressToString(ref local, (uint)Marshal.SizeOf(local), IntPtr.Zero, builder, ref length);
                Ws232Util.WSACleanup();
 
                if (builder.ToString().Split(':').Length > 0)
                    return builder.ToString().Split(':')[0];
                else
                    return "";
            }
        }
 
        public string Port
        {
            get
            {
                sockaddr_in local = this;
                uint length = 256;
                StringBuilder builder = new StringBuilder((int)length);
 
                WSAData data = new WSAData();
                Ws232Util.WSAStartup(2, ref data);
                Ws232Util.WSAAddressToString(ref local, (uint)Marshal.SizeOf(local), IntPtr.Zero, builder, ref length);
                Ws232Util.WSACleanup();
 
                if (builder.ToString().Split(':').Length > 1)
                    return builder.ToString().Split(':')[1];
                else
                    return "";
            }
        }
 
        public static sockaddr_in FromString(string host, int port)
        {
            sockaddr_in sockaddr = new sockaddr_in();
            int lpAddressLength = Marshal.SizeOf(sockaddr);
            Ws232Util.WSAStringToAddress(host + ":" + port.ToString(), ADDRESS_FAMILIES.AF_INET, IntPtr.Zero, ref sockaddr, ref lpAddressLength);
            return sockaddr;
        }
    }
}

5、sockaddr_in6.cs

using System;
using System.Text;
using System.Runtime.InteropServices;
 
namespace DiancaiBll
{
    [StructLayout(LayoutKind.Explicit, Size = 28)]
    public struct sockaddr_in6
    {
        [FieldOffset(0)]
        public ADDRESS_FAMILIES sin6_family;
        [FieldOffset(2)]
        public ushort sin6_port;
        [FieldOffset(4)]
        public uint sin6_flowinfo;
        [FieldOffset(8)]
        public in6_addr sin6_addr;
        [FieldOffset(24)]
        public uint sin6_scope_id;
 
        internal string Host
        {
            get
            {
                sockaddr_in6 local = this;
                uint length = 256;
                StringBuilder builder = new StringBuilder((int)length);
 
                WSAData data = new WSAData();
                Ws232Util.WSAStartup(2, ref data);
                Ws232Util.WSAAddressToString(ref local, (uint)Marshal.SizeOf(local), IntPtr.Zero, builder, ref length);
                Ws232Util.WSACleanup();
 
                if (builder.ToString().Split(':').Length > 0)
                    return builder.ToString().Split(':')[0];
                else
                    return "";
            }
        }
 
        internal string Port
        {
            get
            {
                sockaddr_in6 local = this;
                uint length = 256;
                StringBuilder builder = new StringBuilder((int)length);
 
                WSAData data = new WSAData();
                Ws232Util.WSAStartup(2, ref data);
                Ws232Util.WSAAddressToString(ref local, (uint)Marshal.SizeOf(local), IntPtr.Zero, builder, ref length);
                Ws232Util.WSACleanup();
 
                if (builder.ToString().Split(':').Length > 1)
                    return builder.ToString().Split(':')[1];
                else
                    return "";
            }
        }
 
        public static sockaddr_in6 FromString(string host, int port)
        {
            sockaddr_in6 sockaddr = new sockaddr_in6();
            int lpAddressLength = Marshal.SizeOf(sockaddr);
            Ws232Util.WSAStringToAddress(host + ":" + port.ToString(), ADDRESS_FAMILIES.AF_INET6, IntPtr.Zero, ref sockaddr, ref lpAddressLength);
            return sockaddr;
        }
    }
}

6、WSAData.cs

using System;
using System.Runtime.InteropServices;
 
namespace DiancaiBll
{
    [StructLayout(LayoutKind.Sequential)]
    public struct WSAData
    {
        public Int16 version;
        public Int16 highVersion;
 
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
        public String description;
 
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)]
        public String systemStatus;
 
        public Int16 maxSockets;
        public Int16 maxUdpDg;
        public IntPtr vendorInfo;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值