linux socket 基础知识一
一直以来都在做底层网络的开发,最近开始接触socket编程。发现很多书上面基础知识总结的并不精练,而且交代不清,于是决定把我的收获贡献出来。
一:认识socket
什么是socket,socket本质包含两个信息--IP和port。但是实际用的过程中你会发现这个词会用在好几种情况下,主要是两种情况。一是,int sockfd=socket(...),
此时返回的值是socket;两外一种情况是struct sockaddr,该结构体ipv6的版本是struct sockaddr,其中包括ip和port ;其实本质上socket是struct sockaddr,有些程序
sockfd在并没有明显绑定Ip和port 的情况下就可以和远程的计算机通讯,那是因为系统会为没有绑定的sockfd绑定一个合适的ip和port,并在以后的通讯中一直使用。关于
socket还有一个你不得不知道的一个信息,那就是类型,socket有好几种类型,主要有SOCK_STREAM SOCK_DREAM SOCK_RAM ,这些类型是在socket()函数中指定的。
二:socket地址的知识
在大部分的书里面sockaddr定义如下
struct sockaddr { unit8_t sa_len;
sa_family_t sa_family;
char sa_data[14]; }
大部分的服务器linux上,如果你去读取sa_len一定会报错的,因为现在主流的定义应该如下
struct sockaddr { sa_family_t sa_family; char sa_data[14]; }
这是一个通用的结构,总共就16个字节,具体到ipv4和ipv6时,这个结构就变成了另外两个形式,但是他们都占16个字节,所以可以直接类型转换,没有问题。
ipv4socket结构
struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ unsigned char sin_zero[8] };
ipv4 struct in_addr
三:常用函数
<arp/inet.h> inet_addr() inet_ntoa() inet_aton()
<netinet/in.h> htons() htonl() ntohs() ntohl()
<unistd.h> close()
常会遇到的数据结构
<sys/types.h> u_int8_t u_int16_t u_int32_t u_int64 _t int8_t int16_t int32_t int64 _t
<stdint.h> uint8_t uint16_t uint32_t uint64_t