socket(一)

来源:互联网 发布:网络模拟软件 编辑:程序博客网 时间:2024/06/18 14:33

一、什么是socket

    socket可以看成是用户进程与内核网络协议栈的编程接口。socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。

二、套接口地址结构

IPv4地址结构:    

#include <netinet/in.h> 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 */};
sin_family:ipv4应设为AF_INET
sin_port:16位无符号整数,网络字节序
sin_addr:结构体中只有一个成员,32位无符号整数,s_addr

通用地址结构 struct sockaddr{ 。。。};

三、字节序

    大端字节序表示高位数据存在低地址,低位数据存在高,地址。小端字节序刚好相反。不同的主机采用不同的字节序,在通信时,需要将主机字节序转换为网络字节序。网络字节序规定为大端字节序,作为统一的标准。
    举例:0x12345678,大端字节序内存由低到高依次存的是:12 34 56 78;小端字节序内存由低到高依次存的是78 56 34 12,注意不是87654321,而是以字节为单位!

    字节序转换函数:
       #include <arpa/inet.h>       uint32_t htonl(uint32_t hostlong);       uint16_t htons(uint16_t hostshort);       uint32_t ntohl(uint32_t netlong);       uint16_t ntohs(uint16_t netshort);

htonl表示4个字节的整数由主机字节序转换为网络字节序;htons表示2个字节的整数由主机字节序转换为网络字节序。

四、地址转换函数

       #include <sys/socket.h>       #include <netinet/in.h>       #include <arpa/inet.h>       int inet_aton(const char *cp, struct in_addr *inp);       in_addr_t inet_addr(const char *cp);       char *inet_ntoa(struct in_addr in);

inet_aton:作用同下。
inet_addr:点分十进制的IP地址转换为一个32位整数,且是网络字节序。
inet_ntoa:将结构体in_addr中32位无符号整数转换为点分十进制的IP地址。

五、套接字类型




0 0