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网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
随机推荐
- 根据JavaScript中原生的XMLHttpRequest实现jQuery的Ajax
基本介绍 XmlHttpRequest XmlHttpRequest是JavaScript中原生的,历史悠久的一种发送网络请求的方案. 基本上所有前端框架对于网络请求的部分都是基于它来完成的. 在本章 ...
- 对HashMap的一次记录
HashMap的具体学习,认识了解. 前言 也是最近开始面试才发现,HashMap是问的真多.以前听学长或自己在网上看到过一些面试资料都在说集合.线程这块比较重要,面试的重点.自己也是有那抵触情绪,所 ...
- Java 7 新特性之try-with-resources实践理解
想象这么一个情景,我们需要使用一个资源,在使用完之后需要关闭该资源,并且使用该资源的过程中有可能有异常抛出.此时我们都会想到用try-catch语句,在finally中关闭该资源.此时会有一个问题,如 ...
- 有赞Android实习五面都挂了,复习半月再战,转拿腾讯offer!
缘起 为了有赞的面试准备了半个月的样子,当时还投了美团.字节.滴滴.京东,目的只有一个,就是要进大厂,但是只有有赞扛过了一面,其他都是一面就挂了. 前三面都自我感觉良好,以为能稳拿offer的,没想到 ...
- 一台服务器上部署多个Terracotta的方法
在window server 2003 下,利用apache2.2.11+tomcat6+terracotta 群集不能复制session(http://forums.terracotta.org/f ...
- Servelt&&JSP进阶
Servlet与JSP进阶 来自mkw的视频课程的总结 1.前言 内容包括 掌握Java Web核心特性,Servlet核心对象以及JSP九大内置对象.主要有以下的内容: 请求结构 && ...
- druid与知乎平台
背景 知乎作为知名中文知识内容平台,业务增长和产品迭代速度很快,如何满足业务快速扩张中的灵活分析需求,是知乎数据平台组要面临的一大挑战. 知乎数据平台团队基于开源的 Druid 打造的业务自助式的数据 ...
- MySQL索引篇之索引存储模型
本文重点介绍下索引的存储模型 二分查找 给定一个1~100的自然数,给你5次机会,你能猜中这个数字吗? 你会从多少开始猜? 为什么一定是50呢?这个就是二分查找的一种思想,也叫折半查找,每 ...
- 寻找写代码感觉(二)之 Spring Boot 项目属性配置
一.前言 写代码就和恋爱一样,有反馈就要趁热打铁,搞完了项目搭建,接下来就来搞搞项目配置. 二.IDEA设置 1.编码配置 这里所说的就是代码的编码格式,你可以不设置,但是可能要面临的是,很多未知的麻 ...
- Tag Helper 标签助手
简介 标签助手是Razor 页面中自动生成HTML语句的可重用组件.标签助手对应特定的HTML标签,ASP.NET Core 包含大量与HTML标签对应的预定义标签助手. Razor页面中的标签助手作 ...