Linux网络编程之[Socket通信]
- Socket通信的概念
Socket相关函数
Socket通信的概念
Socket(套接字):
它本身是一种通讯机制,它包含了一整套调用接口和数据结构的定义,它给应用进程提供了使用如tcp/ip等网络协议通讯的手段
Linux中的网络编程通过socket接口实现,Socket既是一种特殊的IO,提供对应的文件描述符.一个完整的Socket都有一个(五元组)相关描述{协议,本地地址,本地端口,远程地址(ip地址),远程端口};每一个Socket有一个本地的唯一Socket,由操作系统来进行分配
Socket相关函数
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocol);
Sokect创建在内核中,若创建成功返回内核文件描述符表中的socket描述符号
参数:
domain(常用)
AF_INET ipv4因特网域
AF_INET6 ipv6因特网域
AF_UNIX unix域
AF_SPEC 未指定
protocol
通常为0,表示按给定的域和套接字类型选择默认的协议
type
SOCK_STREAM
流式的套接字,提供可靠的面向连接的通讯流,使用TCP协议,保证数据传输的准确性和顺序性
SOCK_DGRAM
数据报套接字,无连接,数据通过相互独立的报文进行传输,无序,不保证可靠,使用数据报UDP协议
SOCK_RAW
原始套接字允许对低层协议如IP或ICMP直接访问,用于新的网络协议的实现与测试
SOCK_SEQPACKAGE
长度固定,有序,可靠的面向链接的报文传递
Socket通信中的字节序
1:不同体系结构的主机使用不同的字节序存储器中保存多字节证书,字节存储的顺序不同,有的系统是高位在前,低位在后,而有的是低字节在前,高字节在后.
2:字节序分为大端和小端字节序
3:网络协议使用网络字节序,即大端字节序
4:网络传输的数据大家是一定要统一顺序的,所有对于内部字节表示顺序和网络字节顺序不同的机器,就一定要对数据进行转换
(host to net long);
uint32_t htonl(uint32_t hostlong);
将一个32为整数由主机字节序转换为网络字节序
(host to net short)
uint16_t htons(uint16_t hostshort);
将一个16位整数由主机字节序转换成网络字节序
(net to host long)
uint32_t ntohl(uint32_t netlong);
将一个32位整数由网络字节序转换成主机字节序
(net to host short)
uint16_t ntohs(uint16_t netshort);
将一个16位整数由网络字节序转换成主机字节序号
通用的地址结构:
#include<sys/socket.h>
struct sockaddr{
unsigned short sa_family; //internet地址族,AF_XXX
char sa_data[14]; //14bytes的协议地址
}
sa_dat包含了一些远程电脑的地址,端口,套接字的数目,它里面的数据是杂容在一起的
sa_family一般来说,IPV4使用AF_INET
在传递给需要地址结构的函数的时候,把指向该结构的指针转换成(struct sockaddr*)传递进去
Internet地址结构
struct in_addr{
in_addr_t s_addr;//ipv4地址
}
struct sockaddr_in{
short int sim_family;//internet地址族(AF_INET)
unsigned short int sin_port;//端口号,16位
struct in_addr sin_addr; //internet地址,32位IPv4地址
unsigned char sin_zero[8]; //添0(为了格式对齐的填充位)
}
这两个数据类型是等效的,可以相互之间进行转换,通常使用sockaddr_in更方便
IPV4的地址族和字符地址间进行转换
#include<arp/inet.h>
const char *inet_ntop(int domain,const void* restrict addr,char* restrict str,socklen_t size);
返回:成功返回地址字符串指针,出错返回NULL
功能:网络字节序转换成点分十进制
int inet_pton(int domain,const char* restrict str,void* restrict addr);
返回:成功返回1,无效格式返回0,出错返回-1
功能:点分十进制转换成网络字节序
参数:
domain:internet的地址族如AF_INET
addr:Internet地址,如32位IPV4地址
str:地址字符串指针
size:地址字符串大下
struct sockaddr_in sin;
char buf[16];
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_port=htons((short)3000);
if(inet_pton(AF_INET,"192.168.2.1",&sin.sin_addr.s_addr)<=0){
//错误处理
}
printf("%s\n",inet_ntop(AF_INET,&sin.sin_addr.s_addr,buf,sizeof(buf)));
这些其实就是在创建socket的时候相对比较简单的一些调用,具体socket的使用是在传输层结合TCP和UDP来进行使用的
欢迎持续访问博客