LinuxSocket套接字编程基础

Posted 一只当归

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinuxSocket套接字编程基础相关的知识,希望对你有一定的参考价值。

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的空间长度


以上是关于LinuxSocket套接字编程基础的主要内容,如果未能解决你的问题,请参考以下文章

网络编程基础

Unix网络编程 之 socket基础

[架构之路-62]:目标系统 - 平台软件 - 基础中间件 - Linux Socket网络进程间通信的基本原理与示例(AF_INETAF_UNIXAF_TIPC)

C/C++ 网络编程3: 套接字基础

C/C++ 网络编程3: 套接字基础

Linux Socket:如何在客户端程序中检测断开的网络?