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网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
随机推荐
- 实战 | Hive 数据倾斜问题定位排查及解决
Hive 数据倾斜怎么发现,怎么定位,怎么解决 多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例.当工作中遇到了倾斜问题,这些理论很难直接应用,导致我们面对倾斜时还是不知所措 ...
- gitlab维护之修改clone地址
因为配置了域名访问gitlab私有仓库,但是在项目clone这里,显示的还是ip地址,并且还带端口,每次访问,clone都需要自己修改,比较不方便. 修改方法: sudo vim /opt/gitla ...
- WinForm设置任务栏托盘程序
程序设计界面如下图所示: 1.在程序初始化加载的时候设置程序图标,具体code如下: private void Form1_Load(object sender, EventArgs e) { //t ...
- C++STL—string类
string容器 1.1 string容器的基本概念 string容器是一个类 这个容器中有一个指针,指针维护了一个数组 string容器提供copy.find.insert.replace等等功能 ...
- golang web框架 kratos中的日志框架
kratos是bilibili开源的一个web框架. 日志用法: logger.go package kratoslog import ( "flag" "github. ...
- idea 生成 javaDoc
idea 生成 javaDoc 使用命令 Generate javaDoc - 直接输入javadoc就可以了 Generate JavaDoc scope 3个区域,一般选择第三项自定义,选择模块, ...
- NOIP 模拟 $38\; \rm c$
题解 \(by\;zj\varphi\) 发现就是一棵树,但每条边都有多种不同的颜色,其实只需要保留随便三种颜色即可. 直接点分治,将询问离线,分成一端为重心,和两端都不为重心的情况. 每次只关心经过 ...
- maven打包war,导入本地jar包
方法1: 一 . 在项目根目录创建lib文件夹,把jar放入lib文件夹中 二 . 在项目中使用本地jar pom文件配置如下: <properties> <project.buil ...
- 软件研发中也有5S 管理?
在精益生产中,价值流是贯穿生产全程的关键要素,标准化作业是实现生产线同步的关键工具,而生产现场的5S 管理则是管理一切生产要素的基础,所以我们将5S 称为精益的基础并不为过.5S 管理不仅可以应用到车 ...
- 剑指 Offer 13. 机器人的运动范围
剑指 Offer 13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一 ...