套接字编程:UDP通信程序编写、套接字接口、字节序转换接口

简介: 套接字编程:UDP通信程序编写、套接字接口、字节序转换接口

一、套接字编程简介


1. socket套接字


套接字编程:网络通信程序的编写。


套接字:


       操作系统向上层提供的用于实现网络通信实现的统称。


2. 网络通信


       网络通信其实都是网络中两台主机之间的通信;其中一端叫做客户端,一端叫做服务端:


       服务端:针对用户请求提供服务的一端;是被动接收请求的一端。


       客户端:用户的一端;是主动发出请求的一端。


3. 传输层协议:TCP&UDP


TCP:传输控制协议,面向连接,可靠传输。面向字节流;


       应用于对安全性要求大于实时性要求的场景。例:文件传输、


UDP:用户数据报协议,无连接,不可靠,面向数据报。


       应用于对实时性要求大于安全性要求的场景。例:视频、音频、


二、UDP通信程序编写


1.服务端流程


1.1 创建套接字

       在内核中创建socket结构体,将进程与网卡关联起来。


1.2 为套接字绑定地址信息

       给创建的套接字socket结构体描述源端地址信息。


作用:


       1)告诉系统,网卡收到的那条数据应该交给我来处理;


       2)当发生数据时,使用绑定的地址信息作为源端地址信息。


1.3 接收数据


       从socket的接收缓冲区中取出数据。


1.4 发送数据


       把要发送的数据放到发送缓冲区中。


1.5 关闭套接字


2.客户端流程


2.1 创建套接字


2.2 为套接字绑定地址信息(不推荐)


       客户端并不推荐主动绑定地址。


原因:


       1)绑定之后,程序只能启动一个;


       2)客户端并不需要固定使用某个地址。


2.3 向服务器发送数据

       发送数据前,若socket没有绑定指定地址,则系统会自动选择一个合适的地址信息进行绑定。


2.4 接收数据


2.5 关闭套接字

三、套接字相关接口


1. 创建套接字


int socket(int domain, int type, int protocol);


       domain:地址域类型:      


               ipv4: AF_INET;


               ipv6:AF_INET6;


       type:套接字类型:


               SOCK_STREAM:提供字节流传输服务;


               SOCK_DGRAM:提供数据报传输服务;


       protocol:协议类型:


               0:默认类型;


               TCP:IPPROTO_TCP;


               UDP:IPPROTO_UDP;


返回值:


       成功,返回一个套接字描述符;失败,返回-1。


2. 绑定地址信息


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


       sockfd:创建套接字返回的描述符;


       addr:要绑定的地址信息结构(需要自己封装):


               ipv4:struct sockaddr_in;


               ipv6:struct sockaddr_in6;


       addrlen:地址信息长度;


返回值:


       成功,返回0;失败,返回-1。


例:


image.png


bind会根据用户封装的地址信息的第一个sa_family成员,来判断其类型。


3. 发送数据


ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, 
        const struct sockaddr *dest_addr, socklen_t addrlen);


       sockfd:套接字描述符;


       buf:要发送的数据的空间首地址;


       len:要发送的数据长度;


       flags:选项标准  0-默认阻塞发送;


       dest_addr:对端地址信息


       addrlen:地址信息长度;


返回值:


       成功,返回实际发送的数据的字节长度;失败,返回-1。


4. 接收数据


ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
        struct sockaddr *src_addr, socklen_t *addrlen);


       sockfd:套接字描述符;


       buf:一块空间首地址,用于存放从内核获取到的数据;


       len:要获取的数据长度;


       flags:默认0-阻塞接收;


       src_addr:当前接收数据的发送方的地址信息;


       *addrlen:这是一个输入输出型参数,指定想要多长的地址,返回实际长度;


返回值:


       成功,返回实际接收到的数据长度;失败,返回-1。


5. 关闭套接字


int close(fd);


       fd:套接字描述符。


四、字节序转换接口

 


#include<arpa/inet.h>


1. 主机字节序—>网络字节序


uint32_t htonl(uint32_t hostlong);

   

主机字节序—>网络字节序;针对类型32位。


uint16_t htons(uint16_t hostshort);


       主机字节序—>网络字节序;针对类型16位。


2. 网络字节序—>主机字节序


uint32_t ntohl(uint32_t netlong);


       网络字节序—>主机字节序;针对类型32位。


uint16_t ntohs(uint16_t netshort);


       网络字节序—>主机字节序;针对类型16位。


3. 字符串IP地址字节序转换


3.1 字符串IP地址—>网络字节序的整数IP地址


int_addr_t inet_addr(const char *cp);
        int inet_pton(int af, const char *src, void *dst);
                ipv4:af = AF_INET;
                ipv6:af = AF_INET6;


3.2 网络字节序的整数IP读者—>字符串IP地址

 

char *inet_ntoa(struct in_addr addr);


               注:此函数中用的是静态的空间存放字符串IP地址。


const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
                ipv4:af = AF_INET;
                ipv6:af = AF_INET6;


相关文章
|
29天前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
35 0
Linux C/C++之TCP / UDP通信
|
2月前
|
C语言
C语言 网络编程(七)UDP通信创建流程
本文档详细介绍了使用 UDP 协议进行通信的过程,包括创建套接字、发送与接收消息等关键步骤。首先,通过 `socket()` 函数创建套接字,并设置相应的参数。接着,使用 `sendto()` 函数向指定地址发送数据。为了绑定地址,需要调用 `bind()` 函数。接收端则通过 `recvfrom()` 函数接收数据并获取发送方的地址信息。文档还提供了完整的代码示例,展示了如何实现 UDP 的发送端和服务端功能。
|
3月前
|
网络协议 数据处理 C语言
网络编程进阶:UDP通信
网络编程进阶:UDP通信
156 0
|
3月前
|
C语言
【C语言】UDP通信
【C语言】UDP通信
35 0
|
4月前
|
网络协议 网络架构
【网络编程入门】TCP与UDP通信实战:从零构建服务器与客户端对话(附简易源码,新手友好!)
在了解他们之前我们首先要知道网络模型,它分为两种,一种是OSI,一种是TCP/IP,当然他们的模型图是不同的,如下
184 1
|
4月前
|
网络协议 Java 数据处理
(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述
就目前而言,多数网络编程的系列的文章都在围绕着计算机网络体系进行阐述,但其中太多理论概念,对于大部分开发者而言,用途甚微。因此,在本系列中则会以实际开发者的工作为核心,从Java程序员的角度出发,详细解读Java的网络编程核心内容。
|
5月前
|
网络协议
tcp套接字和udp套接字可以共用一个端口吗?
tcp套接字和udp套接字可以共用一个端口吗?
62 1
|
4月前
基于QT实现的QQ聊天简易版(UDP通信版)
源码已经给小伙伴们整理好了,微信搜索 嵌入式工程之家 关注公众号回复 QQ 即可获得源码和详细操作指示哦~
100 0
|
5月前
UDP通信
UDP通信
32 1
|
5月前
|
Java 程序员 Linux
网络编程套接字(3)——Java数据报套接字(UDP协议)
网络编程套接字(3)——Java数据报套接字(UDP协议)
46 0