Linux下Socket编程学习(一)

sockaddr_in详细讲解

IPV4套接口地址结构通常也称为”网际套接字地址结构“,它以"sockaddr_in"命名,定义在头文件

<netinet/in.h>中

struct sockaddr_in{

   uint8_t sin_len;    //整个sockaddr_in结构体的长度

   sa_family_t sin_family;    //指定地址家族,AF_INET使用的是ipv4协议

   in_port_t sin_port;             //端口

  struct in_addr  sin_addr;  //ipv4地址

  char sin_zero[8];          //不使用设置为0

}

查看详细信息 man 7 ip

in_addr{

   uint32_t s_addr;     //无符号32位整数  必须为网络字节序

}

通用的地址结构

struct sockaddr{

   uint8_t sin_len;        //整个sockaddr的长度

   sa_family_t sin_family;   //指定该地址家族

    char sa_data[14];      //由sin_family决定它的形式

}


为什么要有通用地址结构?因为不仅有tcp/ip协议,还有unix域协议。


小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。

大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端。

网络字节序
我们知道网络上的数据流是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它是将这个字节作为高位还是低位来处理呢? 
网络字节序定义:收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。而在发送端发送数据时,发送的第一个字节是该数字在内存中起始地址对应的字节。可见多字节数值在发送前,在内存中数值应该以大端法存放。 
网络字节序说是大端字节序。 

地址转换函数
int inet_aton(const char* cp,struct  in_addr *inp);   //
in_addr_t   inet_addr(const char*cp);   //点分十进制ip转换成32位整数 inet_addr_t 为unsigned long
char * inet_ntoa(struct in_addr in);    //地址结构转换成点分十进制ip地址

套接字类型
1、流失套接字(SOCK_STREAM)  在tcp/ip中就是tcp协议
       提供面向连接的、可靠地数据传输服务,数据无差错,无重复的发送,而且按发送顺序接收
2、数据报套接字
        提供无连接服务。不提供无保证 其实就是UDP
3、原始套接字



你可能感兴趣的:(Linux下Socket编程学习(一))