BSD socket编程学习
1.socket简介
BSD是实现TCP/IP协议通信的软件系统,socket是应用编程接口,为app提供使用TCP/IP协议通信的接口。
网络层IP提供点到点服务(IP地址标识),传输层TCP和UDP提供端到端的服务(端口号标识)。
2.socket地址结构
2.1 两种socket结构
socket则需要包含了所有这些信息,IP地址,端口号等,那么socket的包含所有这些信息的数据结构和使用方式又是什么样的呢?
有两种socket地址包含了这些信息,一种是linux内核kernel所采用的存储结构sockaddr, 另外一种是具有互联网风格的sockaddr_in,这两种格式是兼容的
//sys/socket.h
/*
* [XSI] Structure used by kernel to store most addresses.
*/
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family; /* [XSI] address family */
char sa_data[]; /* [XSI] addr value (actually larger) */
};
可以看到OS采用的这种sockaddr结构 存储绝大部分的地址
//netinet/in.h
/*
* Socket address, internet style.
*/
struct sockaddr_in {
__uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[];
}; /*
* Internet address (a structure for historical reasons)
*/
struct in_addr {
in_addr_t s_addr;
};
sockaddr_in这种风格的数据结构便于进行(因特网)网络通信,所以常常需要在这两种格式间进行转换。
2.2 两种socket地址结构转换
对于转换函数htons,htonl,inet_addr,inet_aton,inet_ntoa等
2.2.1 本地->网络
- 将主机字节顺序转化为网络字节顺序:htons,htonl
- htons 将主机的无符号短整型数转换成网络字节顺序,与之相反的是ntohs;
- htonl 将主机的无符号长整型的网络字节顺序,与之相反的是ntohl;
- IP地址,将字符串转换为32bit的IP地址:inet_addr,inet_aton
- inet_addr 将字符串转换为32bit二进制网络字节序的ipv4地址(in_addr) e.g."127.0.0.1"-> uint32_t, 点分形式“a.b.c.d”任何一项都不能超过255,否则返回INADDR_NONE;
- inet_aton将一个字符串IP地址转化为一个32bit的网络序列ipv4地址, 与inet_addr的区别就是它认为“a.b.c.d”中任意一项=255都是有效地, 与之相反的是inet_ntoa;
2.2.2 网络->本地
- 将网络字节顺序转化为主机字节顺序:ntohs,ntohl
- IP地址,将32bit的网络IP地址 转换为 点分形式字符串: inet_aton
2.2.3大端序和小端序
为什么要进行这些麻烦的转化呢?
主要原因是在进行网络通信时候,使用的是网络字节顺序NBO(Network Byte Order),按从高位到低位的顺序存储、发送,即MSB(高位字节优先),这样避免兼容问题;
但是在本地主机存储的时候,却使用的是主机字节顺序HBO(Host Byte Order),这是跟具体的CPU设计相关的。
这就引出另外一个问题:大端序和小端序。
- 大端序 最高字节数存储在内存地址最低位(起始位)(可以简单理解成尾端最大(高)字节)
假如现在内存中地址位为0x10的位置处,存储了一个4B数据0x07654321 ->
| 地址 | 内容 | 数的字节位 |
| 0x13 | 0x21 | |
| 0x12 | 0x43 | |
| 0x11 | 0x65 | |
| 0x10 | 0x07 | 最高位 |
- 小端序最低字节数存储在内存地址最低位(起始位)(可以简单理解成尾端最小(低)字节)
假如现在内存中地址位为0x10的位置处,存储了一个4B数据0x07654321 ->
| 地址 | 内容 | 数的字节位 |
| 0x13 | 0x07 | |
| 0x12 | 0x65 | |
| 0x11 | 0x43 | |
| 0x10 | 0x21 | 最低位 |
判断方法,最好只看起始位(地址低位)是最高字节数据(大端序)还是最低字节数据(小端序)。
3.编程模型
Server
| 步骤 | 内容 | data structure/API | 备注 |
| 1 |
初始化socket地址(internet风格 协议簇, IP地址, 端口号) |
struct sockaddr_in |
无 |
| 2 | 创建socket (tcp/udp, 字节流等) | socket() | 无 |
| 3 | 绑定socket和socket地址(本地系统风格) | bind() | 无 |
| 4 | 监听socket(IP地址和端口) | listen() | 无 |
| 5* | 接收连接请求 | accept() | 响应客户端连接请求connect() |
| 6* | 发送数据 | send() | 向连接的客户端发送数据 |
| 7* | 接收数据 | recv() | 接收连接的客户端发送数据 |
| 8 | 关闭socket | close() | 无 |
BSD socket编程学习的更多相关文章
- socket编程学习step1
socket学习参考链接,赞一个:http://blog.csdn.net/hguisu/article/details/7445768 sockets(套接字)编程有三种,流式套接字(SOCK_ST ...
- JAVA Socket 编程学习笔记(二)
在上一篇中,使用了 java Socket+Tcp/IP 协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信. 1. 关于UDP UDP协 ...
- JAVA Socket 编程学习笔记(一)
1. Socket 通信简介及模型 Java Socket 可实现客户端--服务器间的双向实时通信.java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的cli ...
- Socket编程学习之道:揭开Socket编程的面纱
对TCP/IP.UDP.Socket编程这些词你不会非常陌生吧?随着网络技术的发展.这些词充斥着我们的耳朵. 那么我想问: 1. 什么是TCP/IP.UDP? 2. S ...
- LInux下socket编程学习笔记
1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...
- 记一次:Windows的Socket编程学习和分析过程
Socket编程依赖于:WS2_32.dll --- 服务端 --- .导入我们需要的函数 #incldue <windows.h> //#include<WinSock2.h> ...
- Android Socket编程学习笔记
http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ...
- C++的socket编程学习
前言 不得不承认作为一个前端开发,仍有一个后台开发的梦.从socket通信开始学习,在工作之余补充学习点相关知识,记录下学习的过程. 服务端 服务器代码如下,在设置listen之后,通过accept获 ...
- Linux IPC BSD socket编程基础
头文件 #include<unistd.h> #include <sys/types.h> #include <sys/socket.h> #include< ...
随机推荐
- 如何判断WLC的FUS版本
有些时候,我们在升级WLC的时候,被告知需要升级WLC的FUS,以防止某些漏洞和不必要的情况发生. 1.什么是FUS? Field Upgrade Software (FUS),翻译过来,叫“现场升级 ...
- WLC-安装license
在CLI界面安装licenseStep 1 Install a license on the controller by entering this command:①license install ...
- netty实现websocket客户端(附:测试服务端代码)
1,客户端启动类 package test3; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import ...
- leetcode 0209
目录 ✅ 500. 键盘行 描述 解答 ✅ 905. 按奇偶排序数组 描述 解答 py sorted 参数详解 ✅ 559. N叉树的最大深度 描述 解答 java dfs-like method(r ...
- java面试(二)
1.java常见的容器 几乎所有的容器都继承了Collecton接口,包括List.Set.Queue.Map List包括Vector.ArrayList.LinkedList, Set包 ...
- vector 踩过的坑
今天,做LeetCode上的一道题,198题:Rob House,在纸上画了画,发现了重复的结构,就使用了递归的方式实现的 #include<iostream> #include<v ...
- redhat7.6 httpd配置php模块
1.安装php yum install "*php*" -y 2.编辑httpd.conf配置文件 找到LoadModule foo_module modules/mod_fo ...
- Python 基础之正则之二 匹配分组,正则相关函数及表达式修饰符
四.匹配分组 [元字符] 分组符号 a|b 匹配字符a 或 字符b (如果两个当中有重合部分,把更长的那个放前面) (ab) 匹配括号内的表达式 ,将()作为一个分组 num 引用分组 ...
- Mockito 中文文档 ( 2.0.26 beta )
Mockito 中文文档 ( 2.0.26 beta ) 由于缺乏校对,难免有谬误之处,如果发现任何语句不通顺.翻译错误,都可以在github中的项目提出issue.谢谢~ Mockito框架官方地址 ...
- 5-2 使用antDesign的Table 及 modal(对话情景框) 功能
1,进入antDesign官网,粘贴table代码 2,看代码各个部分实现什么功能,根据需求改代码 表格类似如下: 代码如下: const columns = [ { title: 'Name', d ...