linux socket 编程 —— 霸气的宏定义
高考完了,闲着没事, 想写一个 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 编程 —— 霸气的宏定义相关推荐
- Linux Socket编程
IP socket 是在其上建立高级Internet 协议的最低级的层:从HTTP到SSL到POP3到Kerberos再到UDP-Time,每种Internet协议都建立在它的基础上.为了实现自定义的 ...
- Linux内核源码中使用宏定义的若干技巧
在C中,宏定义的概念虽然简单,但是真要用好却并不那么容易,下面从Linux源码中抽取一些宏定义的使用方法,希望能从中得到点启发: 1. 类型检查 比如module_init的宏定义: 点击(此处)折叠 ...
- linux socket 编程
socket <script type="text/javascript"> </script> <script type="text/j ...
- Windows Socket和Linux Socket编程的区别
2019独角兽企业重金招聘Python工程师标准>>> 1.一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2. ...
- Linux Socket编程入门——浅显易懂
文章目录 1. 概述 2. Socket 3. 网络字节序 4. sockaddr 数据结构 5. 网络套接字API函数 5.1 socket() 5.2 bind() 5.3 listen() ...
- 【C语言】Linux内核源码--min,swap宏定义
Linux3.5的部分宏定义在linux-3.5/include/linux/kernel.h的头文件中有定义 一: 最大值和最小值相关的宏 /** min()/max()/clamp() macro ...
- Linux下的两个经典宏定义【转】
转自:http://www.linuxidc.com/Linux/2015-07/120014.htm 本文首先介绍Linux下的经典宏定义,感受极客的智慧,然后根据该经典定义为下篇文章作铺垫. of ...
- 【Linux Socket 编程入门】05 - 拉个骡子溜溜:TCP编程模型代码分析
(一) 看看以前学了啥 前面介绍了socket的分类,IP地址,端口号(port),常用的socket数据结构以及常用的函数.现在我们来看一个例子,看看socket编程究竟是什么. (二) 一图看懂客 ...
- C语言编程入门——枚举与宏定义
枚举是编程人员自己定义的一种基本数据类型,这种类型的变量只能取枚举中的值,好处就是能够防止变量的错误赋值.用法:enum 类型名{变量1,变量2,变量3,...} C语言中宏定义是定义在程序头部,作预 ...
最新文章
- DARPA人工智能技术研究情况一览
- 降低网站跳出率的六个方法(亲身使用)
- 前端解析Excel文件js-xlsx与bootstrapTable
- linux weblogic 引用antlr.jar,Linux環境下Weblogic部署應用的一些問題
- 亿佰特物联网通信-智慧城市的未来城市愿景
- 求一个张量的梯度_张量流中离散策略梯度的最小工作示例2 0
- 100%移植阿里云移动测试技术,竟仅需1周?! ——移动测试专有云(1)
- JAVA50道经典编程题
- 同济大学土木工程学院招收2名秋季入学全日制博士生
- 活动文档服务器,服务器 活动
- vue-touch不能上下滑动的问题【解决】
- eureka默认端口号是多少_从eureka报错中得知的默认配置
- 面向对象编程---掷骰子游戏
- 常微分方程 $6 一阶微分方程解的存在唯一性
- 老板必看:1.初创业团队没有激情,咋办? 2.小股东的选择
- 采购订单和 采购申请 的表
- PDPS软件:机器人固定点焊虚拟仿真操作方法
- python-基础语法
- 开源硬件论坛,燃烧你的创造力 | COSCon'18 特辑
- sshpass命令的安装使用