Linux网络编程之[Socket通信的常用函数简介]

Linux网络编程之[Socket通信]

  1. Socket通信的概念
  2. 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来进行使用的
欢迎持续访问博客

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值