Socket编程

发布于:2024-05-15 ⋅ 阅读:(97) ⋅ 点赞:(0)

网络套接字: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 */
           };


网站公告

今日签到

点亮在社区的每一天
去签到