zoukankan      html  css  js  c++  java
  • C++ 结构体 sockaddr_in 转换为C#

         最近在做一个小的项目,用到了C++的类库去调用,其实调用过程中主要就是类型的对应以及参数传递问题。在传递结构体 sockaddr_in 时遇到一些问题。来记录一下。

     C++ 对  sockaddr_in 的定义是这样的:

    typedef struct sockaddr_in {
    
    #if(_WIN32_WINNT < 0x0600)
        short   sin_family;
    #else //(_WIN32_WINNT < 0x0600)
        ADDRESS_FAMILY sin_family;
    #endif //(_WIN32_WINNT < 0x0600)
    
        USHORT sin_port;
        IN_ADDR sin_addr;
        CHAR sin_zero[8];
    } SOCKADDR_IN, *PSOCKADDR_IN;
    
    
    
    typedef struct in_addr {
            union {
                    struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;
                    struct { USHORT s_w1,s_w2; } S_un_w;
                    ULONG S_addr;
            } S_un;
    #define s_addr  S_un.S_addr /* can be used for most tcp & ip code */
    #define s_host  S_un.S_un_b.s_b2    // host on imp
    #define s_net   S_un.S_un_b.s_b1    // network
    #define s_imp   S_un.S_un_w.s_w2    // imp
    #define s_impno S_un.S_un_b.s_b4    // imp #
    #define s_lh    S_un.S_un_b.s_b3    // logical host
    } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

        最开始我在转换为C#的过程中,把里面所有的参数包括 s_w1 ,s_w2 都转换了,然后按照C++传入的参数进行操作,发现其实并没有成功。然后我在想,其实这个socket 传递,只需要知道协议簇,IP地址,端口,就可以传递信息,所以我在原来的基础上进行改善。

    C# 对应的 sockaddr_in 的定义:

          [StructLayout(LayoutKind.Sequential)]
            public struct SockAddr
            {
                public ushort sa_family;            
            }
    
            [StructLayout(LayoutKind.Sequential)]
            public struct SockAddr_In
            {
                public short sin_family;
                public ushort sin_port;
                public In_Addr sin_addr;           
            }
    
            [StructLayout(LayoutKind.Sequential)]
            public struct In_Addr
            {
                public byte s_b1, s_b2, s_b3, s_b4;
            }

    如何调用:

     SockAddr s;
      SockAddr* ps = &s;
      SockAddr_In* psa = (SockAddr_In*)ps;
      var inAddr = new In_Addr();
      string ipAddress = “192.168.0.1”;
      inAddr.s_b1 = byte.Parse(ipAddress.Split('.')[0]);
      inAddr.s_b2 = byte.Parse(ipAddress.Split('.')[1]);
      inAddr.s_b3 = byte.Parse(ipAddress.Split('.')[2]);
      inAddr.s_b4 = byte.Parse(ipAddress.Split('.')[3]);
      psa->sin_addr = inAddr;
      psa->sin_family = 2;
      psa->sin_port = 41231;

    //调用的函数
    UInt32 number = Get_OpenSlot(ref *psa);

    这里说明一下 :

    1.In_Addr 的  s_b1, s_b2, s_b3, s_b4 这四个byte整数的组合代表IP地址。比如IP地址为192.168.0.1 那么这四个整数分别为:192  168  0   1。

    2.sin_port  在传递过成功需要转换,C++里有htons函数 是把整型变量从主机字节顺序转变成网络字节顺序。所以这的port 是需要把原来的转换一下再传递。

  • 相关阅读:
    RecyclerView 数据刷新的几种方式 局部刷新 notify MD
    【图片】批量获取几万张图片
    RV BaseRecyclerViewAdapterHelper 总结 MD
    RecyclerView.ItemDecoration 间隔线
    Kotlin【简介】Android开发 配置 扩展
    Kotlin 特性 语法糖 优势 扩展 高阶 MD
    一个十分简洁实用的MD风格的UI主框架
    折叠伸缩工具栏 CollapsingToolbarLayout
    FloatingActionButton FAB 悬浮按钮
    Glide Picasso Fresco UIL 图片框架 缓存 MD
  • 原文地址:https://www.cnblogs.com/crayoncode/p/6894406.html
Copyright © 2011-2022 走看看