当前位置:  技术问答>linux和unix

一个socket编程中强制类型转换的疑惑

    来源: 互联网  发布时间:2016-09-19

    本文导语:  最近在看socket编程, 有个小问题, 请指教, 万分感激 这两个结构的定义: struct sockaddr_in {   sa_family_t sin_family;   in_port_t sin_port;   struct in_addr sin_addr; }; struct sockaddr {   sa_family_t sa_family;   char sa_data[14]; }; st...

最近在看socket编程, 有个小问题, 请指教, 万分感激

这两个结构的定义:
struct sockaddr_in {
  sa_family_t sin_family;
  in_port_t sin_port;
  struct in_addr sin_addr;
};
struct sockaddr {
  sa_family_t sa_family;
  char sa_data[14];
};

struct sockaddr_in saddr;
bind(sock_id, (struct sockaddr *)&saddr, ...
这个bind中的强制类型转换, 感觉十分别扭.
按我的认识, 这样强制转换后的指针, 可以正常访问sa_family, 而把sizeof(in_port_t)个字节的sin_port挨个放到sa_data里, 以及sin_addr也拆成一个一个字节放到sa_data中.

这? 明显说不通嘛.
为什么两个不同类型的指针转换后为什么还能正常工作啊?

|
这个问题是socket编程系列接口中定义的数据结构决定的。下面是地址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;

在bind(sock_id, (struct sockaddr *)&saddr中,你输入的地址存储的内容,按照几个字节的次序,是完全一致的,所有效果是一样。
比如:
int a=0x12345678;
unsigned char *pC=(unsigned char *)&a;
*pC对应的位置就是0x78;(这里指PC机上字节次序)
*(pC+1)对应的位置就是0x56;
*(pC+2)对应的位置就是0x34;
*(pC+3)对应的位置就是0x12;

    
 
 

您可能感兴趣的文章:

  • 初学socket的疑惑
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • socket编程中的进制转换
  • 高手啊,请问如何将BufferedImage转换为可以用SOCKET传输的数据
  • 请教多个IP的socket转换连接很慢的问题
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3