#### 网路与主机字节序:
```
struct sockaddr_in{
sa_family_t sin_family; //地址族
u_int16_t sin_port; //端口
struct in_addr sin_addr;
}
struct in_addr{
u_sin32_t s_addr; //ipv4网络字节序地址
}
ipv4与网络字节序转换:
不可重入:返回的是静态内存,连续调用返回值会被覆盖
inet_addr(),inet_aton() 点分十进制转换为网络字节序
inet_addr() 与上相反
可重入:
inet_pton() inet_ntop()
注意:使用时,需要强转sockaddr类型
```
#### socket创建
```
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain,int type,int protocol);
参数:
domain:协议族
type:服务类型
```
#### socket命名
```
#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd,const struct sockaddr*my_addr,socklen_t addrlen);
注意:客户端不需要命名,服务端需要命名,因为命名才能被连接
```
#### 监听socket
```
创建监听队列,存放客户连接
#include<sys/socket.h>
int listen(int sockfd,int backlog);
参数:
backlog:半连接和和全连接状态的socket的上限
```
#### 接收连接
```
#include<sys/types.h>
#include<sys/socket.h>
int accept(int sockfd,struct sockaddr*addr,socklen_t*addrlen);
注意:accept只是从监听队列中取出连接,而不论连接处于何
种状态(如上面的ESTABLISHED状态和CLOSE_WAIT状态),更不关
心任何网络状况的变化。
```
#### 读写数据 read write也可以使用,但是socket有专用的读写接口
```
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recv(int sockfd,void*buf,size_t len,int flags);
ssize_t send(int sockfd,const void*buf,size_t len,int flags);
flags参数:flags参数
recv可能返回0,这意味着通信对方已经关闭连接了。recv出错时返回-1并设置errno。
send成功时返回实际写入的数据的长度,失败则返回-1并设置errno。
```
参考:linux高性能服务器编程-游双