【Linux】socket编程1

[复制链接]
发表于 2024-12-22 20:25:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1. 网络字节序

多字节数据有大端和小端之分,网络数据流采用大端字节序,如果主机采用的是小端字节序,那么需要转换。


  • 大端:低地点存高字节,高地点存低字节,例如端口号为2048,为0x0800, 则在网络中传输先发08,后发00
  • 小端:低地点存低字节,高地点存高字节
  1. #include <arpa/inet.h>
  2. uint32_t htonl(uint32_t hostlong);
  3. uint16_t htons(uint16_t hostshort);
  4. uint32_t ntohl(uint32_t netlong);
  5. uint16_t ntohs(uint16_t netshort);
  6. //这里h指host,n指net,l指四个字节数据的转换,s指两个字节的转换
  7. //比如端口转换可以用两个字节的转换,ip可以用四个字节的函数转换
复制代码
查看本机字节序的方法,可以使用联合体来判断。此中联合体成员设置为short类型和字符数组,然后给short类型赋值,然后查看字符数组的内容,就能知道本机的存储字节序。
  1. #include <stdio.h>
  2. union bytelist
  3. {
  4.     short cont;
  5.     char chcon[sizeof(short)];
  6. };
  7. int main()
  8. {
  9.     union bytelist byt;
  10.     byt.cont = 0x0102;
  11.     printf("byte content is [%d], store 00 is [0x%02d] store 01 is [0x%02d]\n",byt.cont,byt.chcon[0],byt.chcon[1]);
  12.     //输出  0201,说明低位数据存内存低位地址,高位数据存内存高位地址,小端存储
  13.     return 0;
  14. }
复制代码
2. ip地点转换函数

  1. #include <arpa/inet.h>
  2. int inet_pton(int af, const char *src, void *dst);
  3. const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
  4. 参数:
  5.     af:只能是这两个 AF_INET or AF_INET6,分别代表ipv4和ipv6
  6.     src:指源字符串或源ip地址
  7.     dst:指目的字符串或目的ip地址
  8.     size:指将ip转成字符串的字符串大小
复制代码
3. sockaddr数据结构

  以前使用sockaddr这个结构体,但是结构体成员区分不够清晰,所以现在ipv4使用sockaddr_in取代它,这两个内存占用大小是一样的,只有内部成员变量有一点区别。
此中:


  • sockaddr内存占用16个字节,16位地点类型(是ipv4还是ipv6),14字节的地点数据
  • sockaddr_in内存占用16个字节,16位地点类型(是ipv4还是ipv6),16位端口号,32位ip地点,8字节空白填充
  1. //sockaddr 结构体
  2. struct sockaddr {
  3.         sa_family_t    sa_family;                 /* address family: AF_INET */
  4.         char         sa_data[14];                        /* 14 bytes of protocol address */
  5. };
  6. //sockaddr_in 结构体
  7. struct sockaddr_in {
  8.     sa_family_t    sin_family; /* address family: AF_INET */
  9.     in_port_t      sin_port;   /* port in network byte order */
  10.     struct in_addr sin_addr;   /* internet address */
  11. };
  12. /* Internet address. */
  13. struct in_addr {
  14.     uint32_t       s_addr;     /* address in network byte order */
  15. };
复制代码
使用的时候转换一下类型:
  1. struct sockaddr_in servaddr;
  2. /* initialize servaddr */
  3. bind(listen_fd, (struct sockaddr *)&servaddr, sizeof(servaddr));
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表