Linux 网络通信 API详解【转载】
TCP/IP分层模型
OSI协议参考模型,它是基于国际标准化组织(ISO)的建议发展起来的,
它分为7个层次:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。
这个7层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛的应用,其重要的原因之一就在于它过于复杂。
但它仍是此后很多协议模型的基础。与此相区别的TCP/IP协议模型将OSI的7层协议模型简化为4层,从而更有利于实现和使用。


协议结构:

以太网协议格式

IP协议格式

TCP协议格式

UDP协议格式

TCP/IP的分层模型
TCP/IP的协议参考模型和OSI协议参考模型的对应关系如下图 :

API函数:
1.socket
函数的作用:建立一个新的socket套接字
函数的原型:int socket(int domain,int type,int protocol)
函数的参数:domain:表示使用何种地址类型,AF_INET:IPV4; AF_INET6:IPV6
type:SOCK_STREAM:TCP面向数据流的
SOCK_DGRAM: UDP使用不连续不可信赖的数据包连接
SOCK_RAM:提供原始网络协议
protocol:指定socket传输协议编号,设为0即可
返 回 值:成功返回socket套接字描述符,失败-1
头 文 件:#include <sys/socket.h>
2.bind
函数的作用:绑定IP地址
函数的原型:int bind(int sockfd,struct sockaddr * my_addr,int addrlen)
函数的参数:sockfd:套接字描述符
my_addr:主机地址
addrlen:sockaddr的地址长度
struct sockaddr
{
unsigned short int sa_family;
char sa_data[14];
};
struct sockaddr_in
{
unsigned short sin_family;
uint16_t sin_port; 端口号
struct in_addr sin_addr; IP地址
unsigned char sin_zero[8];
};
头 文 件:#include <sys/types.h>
#include <sys/socket.h>
返 回 值:成功0;出错-1
3.connect
函数的作用:建立socket连接的通常客户端连接服务器使用
函数的原型:int connect(int sockfd,struct sockaddr * serv_addr,int addrlen);
函数的参数:serv_addr:表示要连接的服务器IP地址
addrlen:struct sockaddr的长度
返 回 值:成功0;出错-1
4.listen
函数的作用:聆听网络,等待连接
函数的原型:int listen(int sockfd,int backlog)
函数的参数:sockfd:描述符
backlog:允许接入的客户端数目
注意:listen并没有连接,只是设置socket的listen模式而已,真正连接的是accept!
返 回 值:成功0,出错-1
5.accept
函数的作用:接收网络的连接,客户端连接,三次握手
函数的原型:int accept(int sockfd,struct sockaddr *addr,int *addrlen);
函数的参数:addr:连接成功填充远端客户机地址
addrlen:struct sockaddr的长度
返 回 值:成功返回新的fd,出错-1
6.send
函数的作用:经过socket传送数据,向对方发送数据
函数的原型:int send(int sock_fd,const void * msg,int len,unsigned int flags)
函数的参数:sock_fd:accept建立起来的socket连接描述符,连接远方的IP地址
msg:发送的数据
len:数据长度
flags:设为0
返 回 值:成功是实际传递出去的字节数,出错-1
7.recv
函数的作用:经过socket接收数据
函数的原型:int recv(int socket_fd,void *buf,int len,unsigned int flag)
函数的参数:sock_fd:accept以后的socket套接字描述符
buf:存放地址
len:接收数据的最大长度
返 回 值:成功:接收的字节数,出错:-1
8.一个例子胜过千言万语:
union MyUnion
{
short value;
char union_bytes[sizeof(short)];
} test; test.value = 0x0102;
if ((test.union_bytes[] == ) && (test.union_bytes[] == ))
{
printf("Big endian. \r\n");//网络字节序,大端对齐(高位在前面)
}
else if ((test.union_bytes[] == ) && (test.union_bytes[] == ))
{
printf("little endian. \r\n");//主机字节序,小端对齐
}
网络字节序,大端对齐(高位在前面)
主机字节序,小端对齐
字节序的转化函数:
头文件:#include <apra/inet.h>
从主机发送到网络:
uint32_t htonl(uint32_t,hostin32); //32位数据传送,从主机到网络
uint16_t htonl(uint16_t,hostin16); //16位数据传送,从主机到网络
从网络到主机:
uint32_t ntohs(uint32_t netint32); //32位的数据接收,从网络到主机
uint16_t ntohs(uint16_t netint16); //16位的数据接收,从网络到主机
9.地址格式的转化
十进制点分形式转化成二进制形式:
inet_addr()
函数的原型:unsigned long int inet_addr(const char *cp);
返 回 值: 成功则返回对应的二进制的数字,失败-1
函数的参数:cp:放置如:”192.168.1.100”的点分IP地址
inet_port()
函数的原型:int inet_pton(int af,const char * src,void *dst)
函数的参数:af:AF_INET,AF_INET6
src:点分的要转化的IP地址
返 回 值:成功1,格式无效0,出错-1
inet_ntop()
函数的作用:二进制地址转换成十进制点分形式
函数的原型:const char * inet_ntop(int af,const void * src,socket_t size)
————————————————
版权声明:本文为CSDN博主「ZM_iTUDOU」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ky_heart/article/details/53057541
Linux 网络通信 API详解【转载】的更多相关文章
- linux sar 命令详解(转载)
linux sar 命令详解 2013-04-01 11:05 [小 大] 来源: 开源中国社区 评论: 0 分享至: 百度权重查询 词库网 网站监控 服务器监控 SEO监控 手机游戏 iPhone游 ...
- linux screen 命令详解(转载)
转载于:http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html 一.背景 系统管理员经常需要SSH 或者telent 远程登录到Li ...
- linux sort 命令详解(转载)
转载:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html#3374576 sort是在Linux里非常常用的一个命令,管排序的 ...
- linux awk命令详解--转载
awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk [-F ...
- Linux下Awk详解(转载)
什么是Awk Awk是一种小巧的编程语言及命令行工具.(其名称得自于它的创始人Alfred Aho.Peter Weinberger 和 Brian Kernighan姓氏的首个字母).它非常适合服务 ...
- linux进程地址空间详解(转载)
linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示window ...
- Linux下的I/O复用与epoll详解(转载)
Linux下的I/O复用与epoll详解 转载自:https://www.cnblogs.com/lojunren/p/3856290.html 前言 I/O多路复用有很多种实现.在linux上,2 ...
- Linux启动流程详解【转载】
在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...
- 网络编程socket基本API详解(转)
网络编程socket基本API详解 socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...
随机推荐
- 1+x 证书 web 前端开发初级对应课程分析
响应国家号召 1+X 证书 Web 前端开发考试样题 官方QQ群 1+x 证书 web 前端开发初级对应课程分析 http://blog.zh66.club/index.php/archives/19 ...
- [转]在.NET Core 2.x中将多个强类型设置实例与命名选项一起使用
自1.0版之前,ASP.NET Core已使用“ 选项”模式配置强类型设置对象.从那时起,该功能获得了更多功能.例如,引入了ASP.NET Core 1.1 IOptionsSnapshot,它允许您 ...
- 黄聪:PHP转换网址相对路径到绝对路径的一种方法
相信很多程序(尤其是采集类的程序)都会有需要把网址的相对路径转换成绝对路径的需要,例如采集到某页面的HTML代码中包含资源文件经常会看到这样的文件名: <link rel="style ...
- OpenGL入门1.6:坐标系统,3D箱子
每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 我们已经学习了如何利用矩阵变换来对所有顶点进行变换 OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备 ...
- Protobuffer学习文档
官方EN:https://developers.google.com/protocol-buffers/docs/pythontutorial 中文:https://cloud.tencent.com ...
- Web前端基础(3):HTML(三)
1. body中的相关标签 1.1 表格标签:table.tr.td HTML表格由<table>标签以及一个或多个<tr>.<th>或<td>标签组成 ...
- Vue介绍以及模板语法-插值
1.Vue的介绍 Vue是一套用于构建用户界面的渐进式框架. 注意:Vue是一个框架,相对于jq库来说,是由本质的区别的:https://cn.vuejs.org/ Vue不支持IE8及一下版本,因为 ...
- C++ 流插入"<<"和流提取">>"运算符的重载
01 流插入<<运算符的重载 C++ 在输出内容时,最常用的方式: std::cout << 1 <<"hello"; 问题: 那这条语句为什么 ...
- JS基础语法---练习:交换两个变量的值
* JavaScript简称为JS * JavaScript是什么? * 是一门脚本语言:不需要编译,直接运行 * 是一门解释性的语言:遇到一样代码就解释一行代码 * C#语言 ...
- HTML语法规范
HTML语法规范 语法规范概述 HTML标签是由尖括号包围的关键词,例如<html> HTML标签通常是成对出现的,例如<html> 和</html> ,我们成为双 ...