好久没有看那Linux网络编程这本书了,今天看到了重点部分—TCP套接字。下面先来看看套接字的地址结构

Linux系统的套接字可以支持多种协议,每种不同的协议都是用不同的地址结构。在头文件<linux/socket.h>中有一个这样的老式结构(现在一般不使用这个结够了)。

struct sockaddr
{
    unsigned short  sa_family;  //套接字的协议簇地址类型,TCP/IP协议对于IPv4地址类型为AF_INET
    char            sa_data[14];//存储具体的协议地址
};

现在一般使用下面这个sockaddr_in结构(用来设置/获取地址信息):

struct sockaddr_in
{
    unsigned short sin_len;      //IPv4地址长度
    short int      sin_family;   //指代协议簇,在TCP套接字编程只能是AF_INET
    unsigned short sin_port;     //存储端口号(使用网络字节顺序),数据类型是一个16为的无符号整形类型
    struct         in_addr sin_addr;//存储IP地址,IP地址是一个in_add结构体(结构在下面)
    unsigned char  sin_zero[8];     //为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节
};

其中,in_addr这个数据结构:

struct in_addr
{
    unsigned long s_addr;   //按照网络字节顺序存储IP地址
};

在现在很火的IPv6中套接字地址结构使用了下面这个结构体(结构中的成员是有序排列的):

#DEFINE SIN6_LEN
struct sockaddr_in6
{
    unsigned short int       sin6_len;   //IPv6结构长度,是一个无符号的8为整数,表示128为IPv6地址长度

short int sin6_family; //地址类型AF_INET6

unsigned short int sin6_port; //存储端口号,按网络字节顺序

    unsigned short int       sin6_flowinfo;  //低24位是流量标号,然后是4位的优先级标志,剩下四位保留
    struct in6_addr          sin6_addr;      //IPv6地址,网络字节顺序
};

struct in6_addr
{
     unsigned long s6_addr;  //128位的IPv6地址,网络字节顺序
};

好了,看个例子更好说明这些结构体的应用,下面以IPv4为例:

struct sockaddr_in mysock;
mysock.sin_family = AF_INET;  //TCP地址结构
mysock.sin_port = htons(3490); //字节顺序转换函数(后面我会介绍的)
mysock.sin_addr.s_addr = inet_addr("166.111.160.10");//设置IP地址
bzero(&(mysock.sin_zero),8);//设置sin_zero为8位保留字节
//如果mysock.sin_addr.s_addr = INADDR_ANY,则不指定IP地址(用于server程序)

一些基本的函数:

IP地址转换函数:inet_addr()和inet_ntoa()

格式:

unsigned long inet_addr(const char *cp);
char* inet_ntoa(struct in_addr in);

[Linux网络编程学习笔记]套接字地址结构相关推荐

  1. 网络编程学习笔记-套接字编程-socket

    本文为了说明例子,用中文作为变量写在了程序里面,一般编程最好不要那么写 前置概念详见 本文目录 概念 基本TCP套接字编程 通信循环 半链接池 链接循环 udp协议 基于TCP协议实现远程执行客户端请 ...

  2. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

  3. 【Linux网络编程】UDP 套接字编程

    [Linux网络编程]UDP 套接字编程 [1]用户数据报协议(UDP) UDP是一个简单的传输层协议,不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数 ...

  4. Linux网络编程:原始套接字的魔力【续】

    如何从链路层直接发送数据帧        本来以为这部分都弄完了,结果有朋友反映说看了半天还是没看到如何从链路层直接发送数据.因为上一篇里面提到的是从链路层"收发"数据,结果只&q ...

  5. 编程开发:Linux网络编程学习笔记

    非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...

  6. 【Linux网络编程】原始套接字编程

    原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据.区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有 ...

  7. 【Linux网络编程】原始套接字实例:发送 UDP 数据包

    以太网报文格式: 详细的说明,请看<MAC 头部报文分析>. IP 报文格式: 详细的说明,请看<IP 数据报格式详解>. UDP 报文格式: 详细的说明,请看<UDP ...

  8. 【Linux网络编程】原始套接字实例:MAC 地址扫描器

    如果 A (192.168.1.1 )向 B (192.168.1.2 )发送一个数据包,那么需要的条件有 ip.port.使用的协议(TCP/UDP)之外还需要 MAC 地址,因为在以太网数据包中 ...

  9. Linux网络编程学习笔记

    声明:1.未经过原作者许可,不可用于商业行为:2.本笔记仅用于知识学习,如有侵权,立即删除. 1.学习链接 黑马程序员-Linux网络编程:https://www.bilibili.com/video ...

最新文章

  1. Java项目:CRM客户关系管理系统(java+Springboot+maven+mysql)
  2. ElasticSearch+聚合+Aggregation+示例
  3. 面试官:注解@Component,@Service是如何被解析的?
  4. java基础系列:集合总结(6)
  5. 专家周 | 电商牛人的新玩法,寺库如何做奢侈品电商?视频社交电商如何运作的?...
  6. php tp5 redis的使用(亲测)
  7. 【python】Get与Post的区别?(面试官最想听到的答案)
  8. 开源开放 | Beyond 预训练语言模型,NLP还需要什么样的知识?
  9. 集成电路的设计 —— 半导体
  10. 自学python要多久-自学Python多久能找到工作
  11. koa2+html模板,Koa2 路由
  12. 神经网络与深度学习第5章:卷积神经网络 阅读提问
  13. Microsoft Dynamics AX 2012
  14. 解决后台传入的大于js最大数值精度的问题
  15. 情商 智商 逆商,哪个最重要?
  16. jQuery轮播图效果+ bxCarousel实现图片滚动切换效果+Mootools Videobox实现视频图片弹出类lightbox效果
  17. ESP8266-Arduino编程实例-MAX44009环境光传感器驱动
  18. body加背景图片没反应_body背景图片,给body加背景图片
  19. 51单片机自学--交通红绿灯模拟
  20. 斯坦福大学深度学习公开课cs231n学习笔记(10)卷积神经网络

热门文章

  1. Java泛型解析(02):通配符限定
  2. 项目问题思考之策略模式
  3. java 创建日程到期提醒_苹果“快捷指令”日程播报完美版
  4. [LGP4859,...] 一类奇怪的容斥套DP
  5. Dockerfile镜像的制作
  6. JVM(3)——Java GC分析
  7. LayIM.AspNetCore Middleware 开发日记(一)闲言碎语
  8. ios 消除 字符串 首尾空格
  9. (转)HTTP 协议之压缩
  10. POJ1269:Intersecting Lines(判断两条直线的关系)