Linux_Socket - juedaiyuer/researchNote GitHub Wiki
#Linux-Socket编程#
IP
-
4个字节,由4个8位域组成,称之为八位体,由两部分组成:网络号,主机号
inet_addr(); //点分十进制->二进制 inet_ntoa(); //二进制->点分十进制
in_addr_t net; //32位IP地址数据类型,typedef unit32_t in_addr_t in_addr //点分十进制
-
当应用进程创建套接字时,操作系统分配一个数据结构存储该套接字相关信息;sockaddr_in
struct sockaddr_in
{
short sin_family;/Address family一般来说AF_INET(地址族)PF_INET(协议族)/
unsigned short sin_port;/Port number(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)/
struct in_addr sin_addr;/IP address in network byte order(Internet address)/
unsigned char sin_zero[8];/Same size as struct sockaddr没有实际意义,只是为了 跟SOCKADDR结构在内存中对齐/
};
字节顺序与大小端问题
- CPU数据处理类型有大端和小端
- 编写网络程序时需要注意大小端的转换
- 网络编程统一使用大端模式
网络字节顺序与主机字节顺序的转换
- tonl()
- htons() 普通数字->网络数据格式
- ntohl()
- ntohs()
BSD Socket 网络编程API
- 创建socket对象-socket()
- 绑定本地IP地址与端口-bind()
- 监听网络-listen()
- 客户端发起连接-connect()
- 服务器接收连接-accept()
- 读/写socket对象
- TCP发送接收数据-send(),recv()
- 关闭socket对象
函数说明
- socket()
头文件: #include <sys/types.h> #include <sys/socket.h> 函数原型: int socket(int domain, int type, int protocol) domain: 协议类型,一般为AF_INET type: socket类型 protocol:用来指定socket所使用的传输协议编号,通常设为0即可
-
bind() 头文件: #include <sys/types.h> #include <sys/socket.h> 函数原型: int bind(int sockfd, struct sockaddr *my_addr, int addrlen) sockfd: socket描述符 my_addr:是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针 addrlen:常被设为sizeof(struct sockaddr)
-
connect() 头文件: #include <sys/types.h> #include <sys/socket.h> 函数原型: int connect(int sockfd, struct sockaddr *serv_addr, int addrlen) sockfd: 目的服务器的socket描述符 serv_addr:包含目的机器ip地址和端口号的指针 addrlen:sizeof(struct sockaddr)
-
listen() 头文件: #include <sys/socket.h> 函数原型: int listen(int sockfd, int backlog); sockfd:socket()系统调用返回的socket描述符 backlog:指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。
-
accept() 头文件:
#include <sys/types.h> #inlcude <sys/socket.h> 函数原型: int accept(int sockfd, void *addr, int addrlen) sockfd:是被监听的socket描述符 addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息 addrlen:sizeof(struct sockaddr_in) -
send() 头文件: #include <sys/socket.h> 函数原型: int send(int sockfd, const void *msg, int len, int flags); sockfd:用来传输数据的socket描述符 msg:要发送数据的指针 flags: 0
-
recv() 头文件: #include <sys/types.h> #include <sys/socket.h> 函数原型: int recv(int sockfd, void *buf, int len, unsigned int flags) sockfd:接收数据的socket描述符 buf:存放数据的缓冲区 len:缓冲的长度 flags:0
网络调试工具
-
tcpdump
-
netstat
显示以太网统计信息和所有协议的统计信息
netstat -e -s
s display networking statistics (like SNMP)
SNMP 简单网络管理协议
仅显示TCP和UDP的统计信息
netstat -s -p tcp udp
- lsof
- 列举系统中已经被打开的文件
说明信息
- /usr/include 用户空间调用
- /usr/src 内核使用
- Ubuntu /usr/include/sys
- 具体的函数信息可以通过-man 2 函数名 查看
source: 杨宗德-Linux高级程序设计-13章-page:329(evernote pdf)