本文共 2606 字,大约阅读时间需要 8 分钟。
Socket相关函数
Socket(套接字):
它本身是一种通讯机制,它包含了一整套调用接口和数据结构的定义,它给应用进程提供了使用如tcp/ip等网络协议通讯的手段 Linux中的网络编程通过socket接口实现,Socket既是一种特殊的IO,提供对应的文件描述符.一个完整的Socket都有一个(五元组)相关描述{协议,本地地址,本地端口,远程地址(ip地址),远程端口};每一个Socket有一个本地的唯一Socket,由操作系统来进行分配#include#include 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位整数由网络字节序转换成主机字节序号
通用的地址结构:
#includestruct 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的地址族和字符地址间进行转换
#includeconst 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来进行使用的
转载地址:http://vzbsn.baihongyu.com/