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
  1. htons 将主机的无符号短整型数转换成网络字节顺序,与之相反的是ntohs;
  2. htonl 将主机的无符号长整型的网络字节顺序,与之相反的是ntohl;
  • IP地址,将字符串转换为32bit的IP地址:inet_addr,inet_aton
  1. inet_addr 将字符串转换为32bit二进制网络字节序的ipv4地址(in_addr)   e.g."127.0.0.1"-> uint32_t, 点分形式“a.b.c.d”任何一项都不能超过255,否则返回INADDR_NONE;
  2. 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编程学习的更多相关文章

  1. socket编程学习step1

    socket学习参考链接,赞一个:http://blog.csdn.net/hguisu/article/details/7445768 sockets(套接字)编程有三种,流式套接字(SOCK_ST ...

  2. JAVA Socket 编程学习笔记(二)

    在上一篇中,使用了 java Socket+Tcp/IP  协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信. 1. 关于UDP UDP协 ...

  3. JAVA Socket 编程学习笔记(一)

    1. Socket 通信简介及模型 Java Socket 可实现客户端--服务器间的双向实时通信.java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的cli ...

  4. Socket编程学习之道:揭开Socket编程的面纱

    对TCP/IP.UDP.Socket编程这些词你不会非常陌生吧?随着网络技术的发展.这些词充斥着我们的耳朵. 那么我想问: 1.         什么是TCP/IP.UDP? 2.         S ...

  5. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  6. 记一次:Windows的Socket编程学习和分析过程

    Socket编程依赖于:WS2_32.dll --- 服务端 --- .导入我们需要的函数 #incldue <windows.h> //#include<WinSock2.h> ...

  7. Android Socket编程学习笔记

    http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ...

  8. C++的socket编程学习

    前言 不得不承认作为一个前端开发,仍有一个后台开发的梦.从socket通信开始学习,在工作之余补充学习点相关知识,记录下学习的过程. 服务端 服务器代码如下,在设置listen之后,通过accept获 ...

  9. Linux IPC BSD socket编程基础

    头文件 #include<unistd.h> #include <sys/types.h> #include <sys/socket.h> #include< ...

随机推荐

  1. XCOJ 1249: 全自动奖学金计算系统

    1249: 全自动奖学金计算系统 时间限制: 1 Sec  内存限制: 64 MB提交: 305  解决: 54 标签提交统计讨论版 题目描述 宣城校区从今年开始,在原有奖学金制度上,设立专项奖学金. ...

  2. iOS 开发之 23种设计模式

    整理了 iOS 开发中用到的设计模式: iOS 开发之 设计模式[一]原型模式 (Prototype pattern) iOS 开发之 设计模式[二]工厂方法模式 iOS 开发之 设计模式[三]抽象工 ...

  3. Mapgis地图颜色配置(专题图配置)----对比Arcgis根据属性配置图斑颜色

    对于大多数arcgis用户来说,根据属性配置图斑颜色对于大家来说应该并不陌生.本文将就arcgis图斑颜色设置与mapgis做出比对,为大家提供更为绚丽的地图配色.    Arcgis颜色配置方案 右 ...

  4. ethtool命令使用

    [root@localhost ~]# ethtool -s eth0 speed 100 duplex full #设置网口的speed和duplex # ethtool eth0Settings ...

  5. bootstrap帮助文档

    概览 深入了解 Bootstrap 底层结构的关键部分,包括我们让 web 开发变得更好.更快.更强壮的最佳实践. HTML5 文档类型 Bootstrap 使用到的某些 HTML 元素和 CSS 属 ...

  6. 1009 Product of Polynomials (25分) 多项式乘法

    1009 Product of Polynomials (25分)   This time, you are supposed to find A×B where A and B are two po ...

  7. LSTM算法公式

    参考:<基于强化学习的开放领域聊天机器人对话生成算法>

  8. Educational Codeforces Round 72 (Rated for Div. 2)C(暴力)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;char s[200007];int a[20 ...

  9. JS - 处理浏览器兼容之 event

    function test(e){ var event = e || windows.event   //  IE : windows.event  ,非IE : e }

  10. 0-1背包问题(0-1 knapsack problem)

    0-1背包问题描述:一个正在抢劫商店的小偷发现了n个商品,第i个商品价值 vi 美元,重 wi 磅,vi 和 wi 都是整数.这个小偷希望拿走价值尽量高的商品,但他的背包最多能容纳 S 磅重的商品,S ...