linux 高性能读书笔记之通用socket地址

####socket网络编程接口
socket的地址是结构体sockaddr
代码如下
struct sockaddr{
sa_family_t sa_family;
char sa_data[14];
}
sa_family 成员是地址族类型(sa_family_t)变量。
地址族类型通常与协议族类型对应
1.二者对应表

协议族地址表描述
PF_UNIXAF_UNIXUNIX本地域协议族
PF_INETAF_INETTCP/IPv4协议族
PF_INET6AF_INET6TCP/IPv6协议族

二者定义在bits/socket.h头文件,值一样,所以二者经常混用

sa_data成员用于存放socket地址值
但是不同的协议族的地址值具有不同的含义和长度

2.协议族及其地址值
协议族地址值含义和长度
PF_UNIX文件的路径名,长度可达108字节
协议族地址值含义和长度
PF_INET16bit 端口号和32bit IPv4地址
PF_UNIX文件的路径名,长度可达108字节
PF_INET616bit 端口号,32bit流标识,128bitIPv6地址,32bit范围ID,共26字节

問題:14字节的sa_data无法容纳多数协议族的地址值,因此linux定义了新的通用socket地址结构体
struct sockaddr_storage{

    sa_family_t sa_familyunsigned long int __sa_align;char __ss_padding[128-sizeof(__ss_align)];

}

ssalign:用于内存对齐

3.专用socket地址
问题: 上述通用结构体很不好用,设置与获取IP地址和端口号需要执行繁琐的位操作。
解决:linux为各个协议族提供了专门的socket地址结构体
3.1
UNIX本地域协议族:
struct sockaddr_un{
sa_family_t sin_family; //地址族AF_UNIX
char sun_path[108]; // 文件路径名

    }TCP/IP协议族有了两个专用struct socketaddr_in{sa_family_t sin_family; //地址族AF_INETu_int16_t sin_port;    //端口号,要用网络字节序表示struct in_addr  sin_addr;    //Ipv4地址结构体}struct in_addr{u_int32_t   s_addr;//IPv4地址,要用网络字节序表示}struct socketaddr_in6{sa_family_t sin6_family; //地址族AF_INETu_int16_t sin6_port;    //端口号,要用网络字节序表示u_int32_t sin6_flowinfo;    //流信息,设置为0struct in6_addr  sin6_addr;    //Ipv6地址结构体u_int32_t sin6_scope_id;     //scope_id实验用}struct in6_addr{unsigned  char sa_addr[16];//IPv6地址,要用网络字节序表示}使用说明:所有专用地址类型的变量在实际使用中都需要转化为通用socket地址类型sockaddr(强制转换)原因:所有的socket变成接口使用的地址参数的类型为sockaddr4.IP地址转换函数IPv4:点分十进制字符串IPv6:16进制字符串in_addr_t inet_addr  (const  char * strptr);int  inet_aton(const   char * cp,  struct  in_addr  *  inp);char *  inet_ntoa(struct  in_addr  in);
本文转自 jackdongting 51CTO博客,原文链接:http://blog.51cto.com/10725691/2067439

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍

参考链接: 可以重写Java中的私有方法吗 JAVA面向对象之代码块与继承 代码块分类 局部代码块 作用:限制变量生命周期 书写位置:在方法中 构造代码块 开发中很少使用 书写位置:类中 方法外 调用时机:如果你有构造代码块 系统会帮你调用 帮你在创建对象…

struts2中s:select标签的使用

转自&#xff1a;https://www.cnblogs.com/Sara-shi/archive/2013/03/13/struts2_select.html 1 静态生成 <s:select name"user.sex" list"#{0:男,1:女}" label"性别" headerKey"" headerValue"请选择性别"></s:se…

[转载] JAVA面试题大全(part_1)

参考链接&#xff1a; 对Java中派生类方法更严格的访问 JAVA面试题大全(part_1) 1、面向对象的特征有哪些方面 (1)抽象&#xff1a; 抽象就是忽略一个主题中与当前目标无关的那些方面&#xff0c;以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题&#xf…

使用mysqladmin命令修改MySQL密码与忘记密码

修改密码&#xff1a; 1.例如你的 root用户现在没有密码&#xff0c;你希望的密码修改为123456&#xff0c;那么命令是&#xff1a; mysqladmin -u root password 123456 2.如果你的root现在有密码了&#xff08;123456&#xff09;&#xff0c;那么修改密码为abcdef的命令是&a…

[转载] java面试100问+参考答案

参考链接&#xff1a; 对Java中派生类方法更严格的访问 1、面向对象的特征有哪些方面 (1).抽象&#xff1a; 抽象就是忽略一个主题中与当前目标无关的那些方面&#xff0c;以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题&#xff0c;而只是选择其中的…

工作所用的模块回滚脚本

俗话说的好&#xff1a;“真男人从来不回滚”&#xff0c;但是家中常备一个回滚脚本也是很有必要的&#xff0c;我所在公司的服务器模块名都是在初始化的时候写进/etc/role_install这个文件里&#xff0c;如下图的这个服务器就是fss服务器&#xff1a; 再比如下面这个服务器&am…

Linux服务器性能评估与优化

一、影响Linux服务器性能的因素 1. 操作系统级 CPU 内存 磁盘I/O带宽 网络I/O带宽 2. 程序应用级 二、系统性能评估标准影响性能因素评判标准好坏糟糕CPUuser% sys%< 70%user% sys% 85%user% sys% >90%内存Swap In&#xff08;si&…

[转载] Java序列化的几种方式以及序列化的作用

参考链接&#xff1a; Java中带有继承的对象序列化 文章转载自&#xff1a; 本文着重讲解一下Java序列化的相关内容。 如果对Java序列化感兴趣的同学可以研究一下。 一.Java序列化的作用 有的时候我们想要把一个Java对象变成字节流的形式传出去&#xff0c;有的时候我们…

nginx 非80、443端口跳转到80、443

其实很简单: 123if ($server_port ! 80 ) { rewrite ^/(.*)$ http://$host/$1 permanent; }举一反三。。。 123if ($server_port ! 443 ) { rewrite ^/(.*)$ https://$host/$1 permanent; }123if ($host ! host ) { rewrite ^/(.*)$ http://host/$1 permanent; }本文转自 ninny…

[转载] 一文彻底搞懂父类引用指向子类对象问题

参考链接&#xff1a; 用子类引用子类对象 vs 父类引用 public class Father { private String name; private int age; private int weight; public void eat() { System.out.println("Father is eating"); } private void run() { System.out.println("Runin…

把控站外seo效果的几个操作点

把控站外seo效果的几个操作点 实际上&#xff0c;站外的seo不仅仅是外链这么简单&#xff0c;还包括用户行为&#xff08;点击&#xff09;&#xff0c;品牌词曝光等工作。大部分情况下&#xff0c;我们所说的站外优化就是发外链。本文就外链相关事宜&#xff0c;讲解些许操作点…

[转载] 【C语言】fopen C4996错误解决

参考链接&#xff1a; C和C#重载可以与继承一起使用吗 C4996 fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 解决方案&#xff1a;添加宏定…

Quartus II 8.1 详解--有图---图片详解 【1讲】

Quartus II 8.1 详解--有图---图片详解 看图片比较清楚&#xff0c;比文章清楚的多 本文转自 zhangguangyi 51CTO博客&#xff0c;原文链接http://blog.51cto.com/bosszhang/808019:

[转载] JAVA数组实现学生成绩统计

参考链接&#xff1a; Java程序的输出 20(继承) 一、项目名称 数组实现学生成绩统计 二、项目描述 1.项目简介&#xff1a; 由用户输入学生人数与名字&#xff0c;并定义当前学期课程数与课程名&#xff0c;并分别录入每位学生每门课程成绩&#xff0c;系统显示输入每位学生每…

建立同步文件的脚本

为避免一个一个的去修改每一个服务器的配置文件&#xff0c;只需要rsync同步一下就可以搞定#!/bin/bash#rsync.shLOCAL_DIR"/opt/admin"test -n "$hosts" || hosts"xxxx xxxx"REMOTE_DIR"/opt/"RSYNC_LOG"/opt/var/log/rsync.log…

[转载] Java三元运算符示例

参考链接&#xff1a; Java中的运算符 本示例说明如何编写Java三元运算符。 这是语法 condition ? get_this_if_true : get_this_if_false Java三元运算符语法 (n > 18) ? true : false; (n true) ? 1 : 0; (n null) ? n.getValue() : 0; 1. Java三元运算符 …

shell下的进度条和最大最小平均值

进度条 C语言下的进度条参考我原来的一篇blog->进度条 1234567891011121314151617181920212223function proc() {i0 str arr(| / - \\) index0 while [ $i -le 100 ] do printf "[%-101s][%d%%][%c]\r" "$str" "$i" "${arr[$index]}&qu…

[转载] 你真的会用 Java 中的三目运算符吗

参考链接&#xff1a; Java中的按位运算符 转载:http://blog.jobbole.com/93511/ 写在前面&#xff1a; 三目运算符是我们经常在代码中使用的&#xff0c;a (bnull?0:1); 这样一行代码可以代替一个 if-else&#xff0c;可以使代码变得清爽易读。但是&#xff0c;三目运算符也…

HTTP Keep-Alive模式

1、什么是Keep-Alive模式&#xff1f; 我们知道HTTP协议采用“请求-应答”模式&#xff0c;当使用普通模式&#xff0c;即非KeepAlive模式时&#xff0c;每个请求/应答客户和服务器都要新建一个连接&#xff0c;完成 之后立即断开连接&#xff08;HTTP协议为无连接的协议&#…

[转载] java:比较运算符

参考链接&#xff1a; Java中的new运算符 1.compareTo()方法: compareTo()方法返回的是一个int类型值. //声明的值 BigDecimal t_sell1 new BigDecimal(); BigDecimal t_sell2 new BigDecimal(); if(t_sell1.compareTo(t_sell2)0){ return "t_sell1的值等于t_sell2&…