linux网络编程(一)
从“单纯建立连接”到“安全建立连接”(2010年)
网络体系结构即指网络的层次结构和每层所使用协议的集合
应用层
应用程序:FTP、E-mail、Telnet
传输层
差错处理/恢复,流量控制,提供可靠的数据传输
网络层
数据分组、路由选择
数据链路层
数据组成可发送、接收的帧
物理层
传输物理信号、接口、信号形式、速率
上下层之间进行交互时所遵循的约定叫做 “接口”
。
同一层之间的交互所遵循的约定叫做“协议”。
设备固有数据格式和网络标准数据格式的转换
(接受者和发送者如果使用的邮件客户端不一样,那么就会出现问题,如何实现用户之间的通信,那么就需要在表示层来起作用,
使得在不同的客户端上拥有相同的网络格式
)
地址管理与路由选择
,作用:在网络相互连接的环境中,将数据从发送端主机发送到接受端主机
数据帧
比特流
>。界定连接器和网络的规格。
TCP/IP协议族
:
应用层 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
传输层 TCP,UDP
网络层 IP,ICMP,RIP,OSPF,BGP,IGMP
网络接口与物理层 SLIP,CSLIP,PPP,ARP,RARP,MTU ,ISO2110,IEEE802.1,EEE802.2
TCP
(Transport Control Protocol)传输控制协议
UDP
(User Datagram Protocol)用户数据报协议
IP
(Internetworking Protocol)网间协议
SMTP
(Simple Mail Transfer Protocol)简单邮件传输协议
HTTP
(Hypertext Transfer Protocol) 超文本传输协议
FTP
(File Transfer Protocol)文件传输协议
ARP
(Address Resolution Protocol)地址解析协议
UDP和TCP
TCP(即传输控制协议)
它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)
适用情况:
传输质量要求较高
,以及
传输大量数据的通信
。
靠数据传输
的场合,通常使用TCP协议
UDP(User Datagram Protocol)用户数据报协议
适用情况:
Socket
是一个编程接口
套接字类型:
流式套接字(SOCK_STREAM)
数据报套接字(SOCK_DGRAM)
原始套接字(SOCK_RAW)
linux:ifconfig
dos:ipconfig
每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由
点分十进制形式
,如192.168.2.222,最后都会转换为一个32位的无符号整数。
in_addr_t inet_addr(const char *cp);
char *inet_ntoa(struct in_addr in);
一般是将accept填充的有关client的信息的结构体中提取IP并显示。
为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别
一般使用 6666 7777 8888 9999 10000 10001 10002
小端序(little-endian) - 低序字节存储在低地址
大端序(big-endian)- 高序字节存储在低地址
如何测试主机字节序:
网络中传输的数据必须按网络字节序,即大端字节序
将主机字节序转化为网络字节序
htonl(uint32_t hostlong);
htons(uint16_t hostshort);
将网络字节序转化为主机字节序
ntohl(uint32_t netlong);
ntohs(uint16_t netshort);
ctags工具测创建和使用
vim -t xxx 在系统内核当中查找xxx
ctrl + ] 追代码(Ctrl+鼠标左键)
ctrl + t 返回上一层(Ctrl+鼠标右键)
流程
int socket(int domain, int type, int protocol);
AF_UNIX 本地通信
AF_INET 网络通信
SOCK_STREAM 流式套接字
TCP
SOCK_DGRAM 数据报套接字
UDP
protocol:协议,通常为0
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
文件描述符,socket的返回值
一般使用:sockaddr_in
sin_family;
//地址族 AF_INET 2个字节
sin_port
; 端口号 2个字节
sin_addr;
s_addr
; ip地址 4个字节
struct sockaddr_in serveraddr;
serveraddr.sin_family
= AF_INET;
serveraddr.sin_port
= htons(9999);
serveraddr.sin_addr.s_addr
= inet_addr("192.168.2.189");
if(bind(sockfd,
(struct sockaddr *)&serveraddr
, sizeof(struct sockaddr)) < 0)
int listen(int sockfd, int backlog);
sockfd:文件描述符,socket的返回值
backlog:允许同时响应客户端请求的个数,一般设置为5,10
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
网络信息结构体(自动填充的客户端的网络信息结构体)
struct sockaddr_in clientaddr;
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
服务器的网络信息结构体(需要自己填充)
if(connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
服务器:accept的返回值(用于向客户端发送)
)
0 阻塞
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
服务器:accept的返回值
0 阻塞
发送端异常退出或者关闭文件描述符
linux网络编程(一)的更多相关文章
- 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"
[深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...
- 【linux草鞋应用编程系列】_5_ Linux网络编程
一.网络通信简介 第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章. 二.linux网络通信 在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...
- Linux 网络编程(IO模型)
针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...
- linux网络编程 no route to host 解决方案
linux网络编程 no route to host 解决方案 [整合资料] (2013-05-13 21:38:12) 转载▼ 标签: net iptables it 分类: Linux 参考资料h ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- Linux网络编程&内核学习
c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...
- linux网络编程_1
本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- Linux网络编程必看书籍推荐
首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
随机推荐
- 配置多个git用的ssh key
参考 http://www.sail.name/2018/12/16/ssh-config-of-mac/ 有一点注意 Host 的名字和 HostName改为一致. 因为从git仓库复制的地址是全程 ...
- 手写Pascal解释器(二)
目录 一.part4 补充理论知识 二.part5 设计生成式 三.part6 一.part4 承接上次的内容,我们继续编写part4,这个部分我们的任务是完成输入一个仅带乘除运算符的表达式,然后返回 ...
- AcWing 第11场周赛题解
计算abc 首先 \(0<=a<=b<=c\) 会随机给出 \(a+b,a+c,b+c,a+b+c\)的值 因为\(a,b,c\)都为正整数,所以\(a+b+c\)一定为最大值 然后 ...
- netty系列之:使用POJO替代buf
目录 简介 decode和encode 对象序列化 使用编码和解码器 总结 简介 在之前的文章中我们提到了,对于NioSocketChannel来说,它不接收最基本的string消息,只接收ByteB ...
- ES6继承和ES5继承是完全一样的么?
继承方式 ES5 prototype 继承 通过原型链(构造函数 + [[prototype]])指向实现继承. (备注:后续__proto__我都会写成[[prototype]]这种形式) 子类的 ...
- SpringMVC学习05(整合ssm)
5.整合SSM 环境要求 环境: IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 要求: 需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单 ...
- docker 安装prometheus和grafna
一.拉取镜像 docker pull prom/prometheus 二.配置 sudo mkdir /etc/prometheus/ sudo vim /etc/prometheus/prometh ...
- 从零开始实现简单 RPC 框架 3:配置总线 URL
URL 的定义 URL 对于大部分程序猿来说都是很熟悉的,其全称是 Uniform Resource Locator (统一资源定位器).它是互联网的统一资源定位标志,也就是指网络地址. 一个标准的 ...
- Oracle 11g数据库下载安装教程
今天重装系统之后发现甲骨文的网站变化较大,下载安装废了一点时间,留下个笔记为以后再装留作参考.本教程是win10,64位系统环境下 1.下载 下载的时候需要登陆甲骨文账号,如果没有的话申请一个也挺快. ...
- DAY04 与用户交 互格式化输出与运算符
与用户交互 输入: input # python2与python3的区别 # python3 res = input('please in put your username>>>& ...