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网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
随机推荐
- spingsecurity 前后端分离跨域,ajax无用户信息
1.自测时用的postman没有任何问题 2.和前端对接时发现登录不上,ajax Error 出错:{"readyState":0,"responseText" ...
- ctf每周一练
buuctf misc: 你猜我是个啥 下载之后,是一个zip文件,解压,提示不是解压文件 放进HxD中进行分析,发现这是一个png文件,改后缀 打开后,发现是一张二维码,我们尝试用CQR进行扫描, ...
- 全网最硬核Handler面试题深度解析
1.简述Handler的实现原理 Android 应用是通过消息驱动运行的,在 Android 中一切皆消息,包括触摸事件,视图的绘制.显示和刷新等等都是消息.Handler 是消息机制的上层接口,平 ...
- Vue实现点击按钮进行文件下载(后端Java)
最近项目中需要实现点击按钮下载文件的需求,前端用的vue,因为文件是各种类型的,比如图片.pdf.word之类的.这里后端是可以返回文件的地址给前端的,但我看了下网上各种五花八门的答案,感觉都不是我想 ...
- Linux命令(七)之上传/共享/挂载文件至Linux系统中
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- 十进制转十六进制 BASIC-10
十进制转十六进制 import java.util.Scanner; public class 十进制转十六进制 { /* 十六进制数是在程序设计时经常要使用到的一种整数的表示方式. * 它有0,1, ...
- HTTP头参数详解及其中的危险
一.重要的头参数 user_agent 发出请求的用户信息 X-Forwarded-For 表示 HTTP 请求端真实 IP(格式:X-Forwarded-For: client, proxy1, p ...
- SQL 练习33
查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名 SELECT Student.SId,Student.Sname,Cname,score from Student,Course,S ...
- NOIP 模拟 7 考试总结
T1 超级大水题,用 \(kmp\) 和 \(hash\) 均能过,但都忘了,结果只打了个暴力.难受.板子题,题解就不放了 Code #include<bits/stdc++.h> #de ...
- SSM自学笔记(二)
3.SpringMVC入门 1.Spring与Web环境集成 1.1 ApplicationContext应用上下文获取方式 应用上下文对象是通过new ClasspathXmlApplication ...