Linux系统编程:网络编程

目录

网络基本知识

TCP(可靠):连接、可靠、字节流

UDP(不可靠):无连接,不可靠,数据报

TCP网络编程:

cs编程

套接字 socket --> int socket(int domain, int type, int protocol);         #include         #include

连接 connect --> int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

IPV4地址结构体

bind --> int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

listen --> int listen(int sockfd, int backlog);

accept --> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);


网络基本知识

网络 —— 解决不同主机间进程的通信

IP地址 —— 用于标识网络中的一台主机

端口号 —— 找到该主机上的一个进程

IP地址组成:网络号 + 主机号

  • 网络号:标识属于哪一个网络
  • 主机号:标识该网络中某一台主机

IP表示方式:IP地址的本质实际上是一个32位的数值,由于人不方便记忆于是出现了“点分十进制”

[0~255].[0~255].[0~255].[0~255]

IPV6是128位,由于IPV4不够用了才出现的

端口号:用来标识一个进程,是16位的数据

分类:1

以OSI为例

物理层:主要定义物理设备标准,主要作用是传输比特流

数据链路层:提供错误检测和纠正,确保数据的可靠传输,定义了如何让格式化数据以帧的形式

网络层(路由器):在位于不同地理位置的网络中的两个主机系统中提供链接

传输层:主要是将从下层接受的数据分段传输,到达目的地址后再进行重组,传输的是数据段

会话层:通过浏览器和爱奇艺服务器建议了一个会话

表示层:加密——解密

应用层:键盘输入了一个数据hello

协议:一套规定彼此双方的规范

编程:

Linux内核应用程序想要用到内核中网络功能(网络协议栈——发挥着网络的功能)

编程接口:socket:套接字

被当作一个特殊的文件来看,操作时当文件来看,获得对应的fd(描述符/字)

基于两个传输层的协议:TCP/UDP

TCP(可靠):连接、可靠、字节流

  1. 面向连接:在进行通信之前,必须建立好一条逻辑上的通路
  2. 提供可靠传输(四个“无”)
  • 无丢失:依靠每个字节编号来丢失重传
  • 无失序:编号,重新排列
  • 无差错:校验重传
  • 无重复:丢弃

应用:①对可靠性要求高的场合②QQ,微信登陆

建立连接:TCP的三次握手 — 目的是建立连接

UDP(不可靠):无连接,不可靠,数据报

  1. 不提供可靠传输
  2. 在数据发送时,不需要建立连接

优势:效率高,实时性好

应用:①对速度和实时性要求高的②广播、组播③无线网的传输

TCP网络编程:

模型

  • cs        client ---- server
  • bs        browser ---- server
  • p2p        peer -- to -- peer(点对点)

cs编程

套接字 socket --> int socket(int domain, int type, int protocol);         #include <sys/types.h>        #include <sys/socket.h>

功能:创建通信的一端

参数:

@domain:通信的范围

  • AF_UNIX        本地通信
  • AF_INET        IPV4
  • AF_TNET6        IPV6

@type:socket的类型       

  • SOCK_STREAM  //流式套接字
  • SOCK_DGRAM  //用户数据报

@prtocol:表示前面类型对应的具体协议

  • SOCK_STREAM —默认走的协议是TCP
  • SOCK_DGRAM — 默认走的协议是UDP
  • 填0表示走默认协议

返回值:成功        返回socket对应的文件描述符

eg:基于TCP协议的socket

int fd = socket(AF_INET,SOCK_STREAM,0);

连接 connect --> int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能:发起连接请求

参数:

@sockfd:客户端的socket文件描述符

@addr:代表服务器端的地址信息

@addrlen:addr对应的地址结构体类型的大小

返回值:成功 0 失败 -1 && errno

IPV4地址结构体

struct sockaddr_in {

sa_family_t sin_family;         /* address family: AF_INET */ --- 代表通信范围 in_port_t sin_port;         /* port in network byte order */ --- 网络字节序格式的端口号 struct in_addr sin_addr;        /* internet address */ --- ip地址

}; /* Internet address. */

struct in_addr {

uint32_t s_addr;         /* address in network byte order */ //uint32_t --unsigned int --- ip地址 --- 网络字节序 };

bind --> int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

listen --> int listen(int sockfd, int backlog);

accept --> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

accept 是个阻塞操作 —— 如果请求连接队列中为空,则会阻塞等待

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值