Socket编程

网络套接字:socket

在通信过程中,套接字一定是成对出现的

一个文件描述符指向一个套接字,该套接字内部由内核借助两个缓冲区实现

插头                        插座

网络字节序

小端法存储:高位高地址,低位低地址 

大端法存储:高位低地址,低位高地址

计算机采用小端法,网络采用大端法,因此需要转换

用到的函数

htonl:--> host to network long:本地专网络(IP)

转过去并不是需要点分十进制,所以需要用到atoi()来转换数据类型string->int

htons:-> host to network short(端口)

ntohl:->  网络转本地(IP)

ntohs:->网络转本地(端口)

192.168.1.110->string->atoi->int->htonl->网络字节序(早期繁琐)

现在的IP地址转换:

inet_pton:

点分十进制转网络字节序,本地字节序转换为网络字节序

int inet_pton(int af, const char *restrict src, void *restrict dst);
        af:ip协议类型   AF_INET 为ipv4 ;  AF_INET6为ipv6

        src:传入 IP地址(点分十进制) const只读

        dst:传出,转换后的网络字节序的IP地址

返回值:成功返回1,

                0表示src指向不是一个有效ip地址,

                -1表示失败。

inet_ntop:

网络字节序转点分十进制

网络字节序转换为本地字节序String ip

 const char *inet_ntop(int af, const void *restrict src,
                             char dst[restrict .size], socklen_t size);
                

        af:协议v4 or v6

        src:网络字节序的IP地址

        dst:转换后的本地字节序

        size:dst的大小

返回值:成功:dst

                失败:null


 

sockaddr数据地址结构

​​​​​​​        man 7 ip

        struct sockaddr_in addr;

        拿到的是结构体,直接取地址没有用,需要进行初始化,在这里进行

        addr.sin_family=AF_INET;

        addr.sin_port=htons(9527);

                int dst;

                inet_pton(AF_INET,"192.168.22.45",(void*) &dst);

        addr.sin_addr.s_addr=dst;

        [*目前在用*] (addr.sin_addr.s_addr=htonl(INADDR_ANY)) 取出系统中有效的任意ip地址,          二进制类型

        bind(fd,(struct sockaddr *)&addr,size)

为什么要强转?因为实际定义有效的内容是struct sockaddr,这是古早的数据类型,现在常用为struct sockaddr_in,所以在传入古早函数bind时需要进行强转


           struct sockaddr_in {
               sa_family_t    sin_family; /* address family: AF_INET */
               in_port_t      sin_port;   /* port in network byte order */
               struct in_addr  sin_addr;   /* internet address */
           };

           struct in_addr {
               uint32_t       s_addr;     /* address in network byte order */
           };

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值