高考完了,闲着没事, 想写一个 c/s ,但是在 协议域 装入有了一些问题。

 struct  sockaddr_in servaddr;servaddr.sin_port = 6789;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);                   //local host ipservaddr.sin_family = AF_INET;

本来很正常的代码,由于我强烈的好奇心,想看下 sockaddr_in 的结构体定义, 不看还好, 一看吓一跳...

struct sockaddr_in{__SOCKADDR_COMMON (sin_);in_port_t sin_port;          /* Port number.  */struct in_addr sin_addr;     /* Internet address.  *//* Pad to size of `struct sockaddr'.  */unsigned char sin_zero[sizeof (struct sockaddr) -__SOCKADDR_COMMON_SIZE -sizeof (in_port_t) -sizeof (struct in_addr)];};

书上直接把 servaddr.sin_family 赋值了, 可是结构体里没有呀, 但编译没错呀,于是开始了我的鼓捣...

书上说的和代码有很多不一样的地方, 看来不能全信书本,还是得自己研究!

    __SOCKADDR_COMMON (sin_);

__SOCKADDR_COMMON 是一个宏变量

#define    __SOCKADDR_COMMON(sa_prefix) \
  sa_family_t   sa_prefix##family

这里面 \ 的意思应该是用前面替换整个声明变量的语句

sa_family_t 是 typedef unsigned short int sa_family_t;

## 是起一个连接字符串生成变量名的作用,  用##前的是一个变量, 这个变量名是 sa_prefix, 而sa_prefix 宏替换成了 sin_  ,所以这宏定义的最终形式是 unsigned short int   sin_family

到这,我才放心的把

servaddr.sin_family = AF_INET;

宏定义很强大,赞一个!

linux socket 编程 —— 霸气的宏定义相关推荐

  1. Linux Socket编程

    IP socket 是在其上建立高级Internet 协议的最低级的层:从HTTP到SSL到POP3到Kerberos再到UDP-Time,每种Internet协议都建立在它的基础上.为了实现自定义的 ...

  2. Linux内核源码中使用宏定义的若干技巧

    在C中,宏定义的概念虽然简单,但是真要用好却并不那么容易,下面从Linux源码中抽取一些宏定义的使用方法,希望能从中得到点启发: 1. 类型检查 比如module_init的宏定义: 点击(此处)折叠 ...

  3. linux socket 编程

    socket  <script type="text/javascript"> </script> <script type="text/j ...

  4. Windows Socket和Linux Socket编程的区别

    2019独角兽企业重金招聘Python工程师标准>>> 1.一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2. ...

  5. Linux Socket编程入门——浅显易懂

    文章目录 1. 概述 2. Socket 3. 网络字节序 4. sockaddr 数据结构 5. 网络套接字API函数  5.1 socket()  5.2 bind()  5.3 listen() ...

  6. 【C语言】Linux内核源码--min,swap宏定义

    Linux3.5的部分宏定义在linux-3.5/include/linux/kernel.h的头文件中有定义 一: 最大值和最小值相关的宏 /** min()/max()/clamp() macro ...

  7. Linux下的两个经典宏定义【转】

    转自:http://www.linuxidc.com/Linux/2015-07/120014.htm 本文首先介绍Linux下的经典宏定义,感受极客的智慧,然后根据该经典定义为下篇文章作铺垫. of ...

  8. 【Linux Socket 编程入门】05 - 拉个骡子溜溜:TCP编程模型代码分析

    (一) 看看以前学了啥 前面介绍了socket的分类,IP地址,端口号(port),常用的socket数据结构以及常用的函数.现在我们来看一个例子,看看socket编程究竟是什么. (二) 一图看懂客 ...

  9. C语言编程入门——枚举与宏定义

    枚举是编程人员自己定义的一种基本数据类型,这种类型的变量只能取枚举中的值,好处就是能够防止变量的错误赋值.用法:enum 类型名{变量1,变量2,变量3,...} C语言中宏定义是定义在程序头部,作预 ...

最新文章

  1. DARPA人工智能技术研究情况一览
  2. 降低网站跳出率的六个方法(亲身使用)
  3. 前端解析Excel文件js-xlsx与bootstrapTable
  4. linux weblogic 引用antlr.jar,Linux環境下Weblogic部署應用的一些問題
  5. 亿佰特物联网通信-智慧城市的未来城市愿景
  6. 求一个张量的梯度_张量流中离散策略梯度的最小工作示例2 0
  7. 100%移植阿里云移动测试技术,竟仅需1周?! ——移动测试专有云(1)
  8. JAVA50道经典编程题
  9. 同济大学土木工程学院招收2名秋季入学全日制博士生
  10. 活动文档服务器,服务器 活动
  11. vue-touch不能上下滑动的问题【解决】
  12. eureka默认端口号是多少_从eureka报错中得知的默认配置
  13. 面向对象编程---掷骰子游戏
  14. 常微分方程 $6 一阶微分方程解的存在唯一性
  15. 老板必看:1.初创业团队没有激情,咋办? 2.小股东的选择
  16. 采购订单和 采购申请 的表
  17. PDPS软件:机器人固定点焊虚拟仿真操作方法
  18. python-基础语法
  19. 开源硬件论坛,燃烧你的创造力 | COSCon'18 特辑
  20. sshpass命令的安装使用

热门文章

  1. 学计算机房空调功率是多少为好,空调功率是多少—空调功率一般有多少呢
  2. 好用的三维绘图软件CREO学习绘制弧
  3. 移动应用开发——基于uni-app框架
  4. ipad 无法同步 问题修复的一种方案
  5. 计算机基础知识题库关于wps,计算机基础及WPS Office基础试题
  6. 树莓派3B+ 驱动开发之GPIO
  7. bzoj2560串珠子——子集DP
  8. 油菜花!Cocos用户圣诞创意作品来啦!
  9. 大学生计算机二级office备考指南
  10. mysql增删改查,连表,排序,等