网络套接字

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

好好看,好好学

好好看,好好学

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默认协议/IPPROTO_UDP-17;
0是tcp默认协议IPPROTO_TCP-6;
udp必须使用SOCK_DGRAM、、tcp必须使用SOCK_STREAM;
返回值:成功返回一个文件描述符-操作句柄;失败返回-1;

2.为套接字绑定地址信息;

int bind(int sockfd,struct sockaddr* addr,socklen_t addrlen);
sockfd:创建套接字返回的操作句柄;
addr:当前绑定的地址信息
addrlen:表示实际地址结构长度
返回值:成功返回0,失败返回-1;

3.发送数据:

ssize_t sendto(int sockfd, void *buf, size_t len, int flags, cosnt struct sockaddr* dest_addr, socklen_t addrlen);
sockfd: 表示套接字操作句柄,
buf 表示要发送的数据的空间首地址,
len 表示数据长度,flags默认是0,表示阻塞发送,
dest_addr 表示接收端地址信息,
addrlen 表示地址结构长度;
返回值:成功返回实际发送的数据字节长度,失败返回-1
udp实际发送数据长度小于要求长度,则失败

4.接受数据:

ssize_t recvfrom(int sockfd, void *buf, int len, int flags, struct sockaddr* src_addr, socklen_t* addrlen);
sockfd 表示套接字操作句柄;
buf 表示放置数据的缓冲区空间首地址;
len 表示要接收的数据长度(不能大于缓冲区长度);
flags 默认是0,表示阻塞接收;
src_addr 本条数据源端地址信息;
addrlen 输入树池参数,指定要接受的数据结构长度,并且返回实际接受的地址长度;
返回值:成功返回实际接收的数据长度,失败返回-1

5.关闭套接字:

int close(int fd);

字节序转换接口:

#include <arpa/inet.h>

   uint32_t htonl(uint32_t hostlong);------32位,主机到网络

   uint16_t htons(uint16_t hostshort);------16位,主机到网络

   uint32_t ntohl(uint32_t netlong);

   uint16_t ntohs(uint16_t netshort);

char *inet_ntoa(struct in_addr in);

将网络字节序IP地址转换为字符串点分十进制IP地址

in_addr_t inet_addr(const char *cp);

将字符串点分十进制IP地址转换为整形网络字节序IP地址;

const char *inet_ntop(int af, const void *src,
                             char *dst, socklen_t size);

int inet_pton(int af, const char *src, void *dst);
  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 }
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值