【Linux】Socket套接字编程基础

本文介绍了UDP(用户数据报协议)在网络通信中的应用,强调其无连接、不可靠但高效的特点。讲解了使用C/S架构进行UDP套接字编程的基本流程,包括服务端的创建套接字、绑定地址、接收和发送数据以及关闭套接字,以及客户端的创建套接字、发送数据、接收数据和关闭套接字。同时,提到了关键的系统调用如socket、bind、sendto、recvfrom和close,并提及了地址转换函数的重要性。
摘要由CSDN通过智能技术生成

socket编程是网络通信程序的编写,涉及到应用层以下各层协议的选择。在传输层中我们主要了解TCP、UDP两种协议:
TCP:传输控制协议,面向连接,面向字节流,是一种可靠的传输通信协议,安全性较高,常用于文件的传输。
UDP:用户数据报协议,无连接,面向数据报,是一种不可靠的传输通信协议,实时速度高,常用于视频/音频的数据传输。
想使用套接字socket接口来进行UDP网络通信程序的编写,首先要了解C/S(客户端/服务端)架构,客户端是主动发起请求的一方,服务端是被动接受请求的一方。
服务端实现的流程:
1.创建套接字,在内核中创建socket结构体
2.为套接字绑定地址信息,给内核中创建的socket结构体中添加IP、PORT信息等,这一步的目的是为了告诉操作系统哪些数据应该放到这个socket缓冲区中交给哪个进程处理
3.接收信息,从对应的socket结构体的接受缓冲区中取出数据
4.回复信息,通过接受信息时获取的发送端信息进行数据回复
5.关闭套接字,释放资源
客户端实现的流程:
1.创建套接字,使进程与网卡之间建立联系
2.为套接字绑定地址信息:每条数据中都有源端地址和对端地址,绑定的地址就是源端地址信息(客户端不建议主动绑定)
3.发送数据(如果没有绑定地址,操作系统会选择合适的端口进行绑定)
4.接收数据
5.关闭套接字,释放资源
在对于服务端/客户端实现的流程有了认识后,下面就是使用具体的接口实现各项功能:
在使用套接字时要添加头文件 #include<sys/socket.h>
1.创建套接字

int socket(int domain,int type,int protocol);
//domain是地址域类型 IPV4是 AF_INET   IPV6是AF_INET6
//type是套接字类型 SOCK_STREAM字节流服务 SOCK_DGRAM数据包服务
//protocol是协议类型 0是默认类型
//字节流服务默认是TCP协议
//数据报服务默认是UDP协议

创建成功返回一个非负整数(套接字描述符)
创建失败返回-1

2.为套接字绑定信息

int bind(int sockfd,const struct sockaddr*addr,socklen_t addrlen);
//sockfd 创建套接字返回的操作句柄
//addr 不同的地址域有不同的地址结构
// addrlen 实际地址空间结构长度

成功返回0
失败返回-1

3.发送数据

ssize_t sendto(int fd,void* buf,size_t len,int flags,struct sockaddr*addr,socklen_t addrlen);
//fd套接字操作句柄
//buf要发送的数据空间首地址
//len 要发送的数据长度(字节)
//flags标志位 默认0 阻塞发送
//addr 对端地址信息

发送数据成功返回实际发送的数据字节长度
失败返回-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);

除了以上五个接口以外,我们还需要了解地址转换接口
htons/htonl:主机字节序到网络字节序的整数转换
ntohs/ntohl:网络字节序到主机字节序的整数转换

点分十进制字符串IP到网络字节序整数IP地址的转换:

int_addr_t inet_addr(const char*cp);//  IPV4
int inet_pton(int af,const char*src,void*dst);//  IPV4/IPV6
//af是地址域类型
//src是字符串IP地址
//dst是返回的转换后的整数地址

网络字节序整数IP地址到点分十进制字符串IP地址的转换:

char*inet_ntoa(struct in_addr in); // IPV4
const char*inet_ntop(int af,const void* src,char*dst,socklen_t size); //IPV4/IPV6
//af是地址域类型
//src是网络字节序整数IP
//dst是返回的转换后的字符串
//size 是dst的空间长度


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值