socket

 

# 字节序转换函数、IP地址转换函数

/*
    网络字节序采用大端
    网络通信时,需要将主机字节序转换成网络字节序(大端),
    另外一个主机获取到数据后根据情况将网络字节序转换成主机字节序


    
        #include <arpa/inet.h>

        // 转换32位数据,一般用于转换ip
        uint32_t htonl(uint32_t hostlong);
        uint32_t ntohl(uint32_t netlong);

        // 转换16位数据,一般用于转换端口号
        uint16_t htons(uint16_t hostshort);
        uint16_t ntohs(uint16_t netshort);


    IP地址转换函数

        #include <arpa/inet.h>

        int inet_pton(int af, const char *src, void *dst);
            参数:
                af:地址族,AF_INET、AF_INET6
                src:点分十进制的ip地址
                dst:传出参数,转换后的结果
            
        const char *inet_ntop(int af, const void *src,
                                char *dst, socklen_t size);
            参数:
                af:地址族,AF_INET、AF_INET6
                src:ip地址的整数
                dst:传出参数,转换后的结果,字符串
                size:第三个参数的大小(数组的大小)
            返回值:
                返回转换后的结果,和dst一样,const不能修改

*/
#include <stdio.h>
#include <arpa/inet.h>

int main()
{
    // unsigned short a = 0x1234;
    // unsigned short c = htons(a);
    // printf("%x\n%x\n", a, c);

    // printf("=================================\n");
    // unsigned char buf[4] = {192, 168, 1, 1};
    // unsigned int num = *(unsigned int *)buf;
    // unsigned int sum = htonl(num);
    // unsigned char *p = (unsigned char *)&sum;
    // printf("%d %d %d %d\n", *p, *(p + 1), *(p + 2), *(p + 3));

    char string_ip[] = "192.168.1.1";
    unsigned int int_ip;
    inet_pton(AF_INET, string_ip, (void *)&int_ip);

    char buf[16];
    inet_ntop(AF_INET, (void *)& int_ip, buf, sizeof(buf));
    // printf("%d %d %d %d\n", *);
    printf("%s\n", buf);






    return 0;
}

 

# socket函数

 

/*
        #include <sys/types.h>
        #include <sys/socket.h>

        int socket(int domain, int type, int protocol);
            功能:创建一个套接字
            参数:
                domain:协议族
                    AF_UNIX, AF_LOCAL:本地(进程间通信)
                    AF_INET:ipv4
                    AF_INET6 :ipv6
                type:通信过程中使用的协议类型
                    SOCK_STREAM:流式协议
                    SOCK_DGRAM:报式协议
                protocol:具体的一个协议,一般写0
                    SOCK_STREAM:流式协议默认使用TCP
                    SOCK_DGRAM:报式协议默认使用UDP
            返回值:
                成功:文件描述符
                失败:-1
        int bind(int sockfd, const struct sockaddr *addr,
                    socklen_t addrlen);
            功能:绑定ip和端口号
            参数:
                sockfd:通过socket得到的文件描述符
                addr:需要绑定的socket地址,封装了IP和端口号的信息
                addrlen:第二个参数的大小
            返回值:
                成功:0
                失败:-1
        int listen(int sockfd, int backlog); 
            功能:监听这个sockfd上的连接
            参数:
                sockfd:socket的文件描述符
                backlog:max(半连接队列,全连接队列)
        int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
            功能:接收客户端连接,阻塞函数
            参数:
                sockfd:用于监听的文件描述符
                addr:传出参数,连接成功后客户端的地址信息
                addrlen:第二个参数对应的内存大小
            返回值:
                成功:用于通信的文件描述符
                失败:-1
        int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
            功能:客户端连接服务器
            参数:
                sockfd:用于通信的文件描述符
                addr:客服端要连接服务器的地址信息
                addrlen:第二个参数的大小
            返回值:
                成功:0
                失败:-1
        
*/

 

posted @ 2023-05-09 11:01  WTSRUVF  阅读(12)  评论(0编辑  收藏  举报