网络套接字 你必须给我把博客写好,这是重点的重点,后续也得写上,不能断

我:接么重要的网络知识你不会
你:有点忘记了
我:忘记还在那,还不点着记记。。想回家种地啊;
你:谢谢哥哥;
我:。。

好好看,好好学

网络套接字 你必须给我把博客写好,这是重点的重点,后续也得写上,不能断

@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 }

网络套接字 你必须给我把博客写好,这是重点的重点,后续也得写上,不能断

上一篇:centos7磁盘挂载与卸载


下一篇:套接字编程2