我:接么重要的网络知识你不会
你:有点忘记了
我:忘记还在那,还不点着记记。。想回家种地啊;
你:谢谢哥哥;
我:。。
好好看,好好学
@TOC
udp协议/tcp协议
udp
协议:
用户数据报协议;
特新:无连接、不可靠、面向数据报;
应用场景:实时性要求大于安全性要求的场景;---视频传输
tcp
协议:
传输控制协议
特性:面向链接、可靠传输,面向字节流;
应用场景:安全性要求大于实时性要求的场景;---文件传输
在网络通信程序中,通信两端分为:客户端、服务器端;
- 客户端: - 通常是提供给客户的通信端,通常是编写通信程序中主动发起请求的一端;
- 服务端:接受请求,向客户提供服务的通信端;
客户端是主动发送请求的一端,也就意味着客户端必须提前能知道服务端的地址信息(ip+port)是多少;
服务器地址通常固定的,并且是提前提供给客户端;
udp通信程序的编写:
网络通信程序的编写都使用的是套接字接口——socket接口
客户端的主要工作为:
(1)创建套接字,使进程与网卡之间建立联系
(2)为套接字绑定地址信息,每条数据中都有源端地址和对端地址,绑定的地址信息就是源端地址信息(客户端不建议主动绑定)
(3)发送数据(如果没有绑定地址则会选择合适的进行绑定)
(4)接收数据
(5)关闭套接字释放资源服务端的主要工作为
:
(1)创建套接字,在内核中创建socket结构体
(2)为套接字绑定地址信息,给内核创建的socket结构体中添加IP,PORT信息(告诉操作系统哪些数据应该放到这个socket的缓冲区交给哪个进程处理)
(3)接受数据,从对应socket结构体的接收缓冲区中取出数据
(4)回复数据,通过接收数据时获取的发送端地址信息进行数据回复
(5)关闭套接字释放资源
客户端:
1.创建套接字:
int socket(int domain,int type,int protocol);
domain:地址域类型--AF_INET-IPv4通信,使用IPv4的地址结构;
type:套接字类型;SOCK_STREAM/SOCK_DGRAM;
protocol:本次通信协议IPPROTO_TCP-6/IPPROTO_UDP-17;
0是udp默认是数据报协议SOCK_DGRAM的协议;
返回值:返回一个文件描述符-操作句柄;
udp必须使用SOCK_DGRAM,tcp必须用SOCK_STREAM;
2.为套接字绑定地址信息;
int bind(int sockfd,struct sockaddr* addr,socklen_t addrlen);
sockfd:创建套接字返回的操作句柄;
addr:当前绑定的地址信息
address_len:表示实际地址结构长度
返回值:成功返回0,失败返回-1;
3.发送数据:
ssize_t sendto(int sockfd, void *buf, size_t len, int flags, struct sockaddr* addr, socklen_t addrlen);
sockfd: 表示套接字操作句柄,
buf 表示要发送的数据的空间首地址,
len 表示数据长度,flags默认是0,表示阻塞发送,
addr 表示接收端口地址信息,
addrlen 表示地址信息长度
返回值:成功返回实际发送的数据字节长度,失败返回-1
4.接受数据:
ssize_t recvfrom(int sockfd, void *buf, int len, int flags, struct sockaddr* src_addr, socklen_t* addrlen);
sockfd 表示套接字操作句柄;
buf 表示放置数据的缓冲区空间首地址;
len 表示要接收的数据长度(不能大于缓冲区长度);
flags 默认是0,表示阻塞接收;
addr 表示发送端口地址信息的接收缓冲区;
addrlen 表示地址信息长度
返回值:成功返回实际接收的数据长度,失败返回-1
5.关闭套接字:
int close(int fd);
字节序转化接口:
1 // udp 服务端的
2 #include<stdio.h>
3 #include<unistd.h>
4 #include<string.h>
5 #include<arpa/inet.h>//字节序转换接口头文件
6 #include<netinet/in.h>//地址结构头文件,协议类型头文件
7 #include<sys/socket.h>//套接字头文件
8
9 //服务端serve
10 int main(){
11 //1.创建套接字
12 //int socket(地址域类型,套接字类型,协议类型);
13 //int sockfd=socket(int domain, int type, int protocol);
14 int sockfd=socket(AF_INET,SOCK_DGRAM, IPPROTO_UDP);
15 if(sockfd<0){
16 perror("socket error\n");
17 return -1;
18 }
19 //2.为套接字绑定地址信息 绑定xshell绑定的地址
20 //int bind(套接字描述符,地址信息,地址长度)
21 //int bind(int sockfd,struct sockaddr* addr,socklen_t addrlen);
22 struct sockaddr_in addr;//定义IPV4地址结构
23 addr.sin_family=AF_INET;
24 addr.sin_port=htons(9000);//设置地址端口
25 addr.sin_addr.s_addr=inet_addr("192.168.106.133");
26 int len=sizeof(addr);
27 int ret=bind(sockfd,(struct sockaddr*)&addr,len);
28 if(len<0){
29 perror("bind error\n");
30 return -1;
31 }
32
33 //需要一直接受数据、发送数据
34 while(1){
35 //3.接受数据
36 //recvfrom(句柄,空间,长度,标志,对端地址,地址长度);
37 //ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
38 // struct sockaddr *src_addr, socklen_t *addrlen);
39 char buf[1024]={0};
40 struct sockaddr_in paddr;
41 int len=sizeof(struct sockaddr_in);
42 ret=recvfrom(sockfd,buf,1023,0,(struct sockaddr*)&paddr,&len);
if(ret<0){
44 perror("recvfrom error\n");
45 return -1;
46 }
47 printf("client said:%s\n",buf);
48
49 char *data="终于看完了~~";
50 //4.发送/回复数据
51 ret=sendto(sockfd,data,strlen(data),0,(struct sockaddr*)&paddr,len);
52 if(ret<0){
53 perror("sendto error\n");
54 return -1;
55 }
56 }
57 //5.关闭套接字
58 close(sockfd);
59 return 0;
60 }