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数据处理类型有大端和小端
  • 编写网络程序时需要注意大小端的转换
  • 网络编程统一使用大端模式

网络字节顺序与主机字节顺序的转换

  1. tonl()
  2. htons() 普通数字->网络数据格式
  3. ntohl()
  4. ntohs()

BSD Socket 网络编程API

  1. 创建socket对象-socket()
  2. 绑定本地IP地址与端口-bind()
  3. 监听网络-listen()
  4. 客户端发起连接-connect()
  5. 服务器接收连接-accept()
  6. 读/写socket对象
  7. TCP发送接收数据-send(),recv()
  8. 关闭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

TCP实现简单聊天程序

网络调试工具

  1. tcpdump

  2. netstat

显示以太网统计信息和所有协议的统计信息
netstat -e -s

s display networking statistics (like SNMP)
SNMP 简单网络管理协议

仅显示TCP和UDP的统计信息
netstat -s -p tcp udp

  1. lsof
  • 列举系统中已经被打开的文件

说明信息

  • /usr/include 用户空间调用
  • /usr/src 内核使用
  • Ubuntu /usr/include/sys
  • 具体的函数信息可以通过-man 2 函数名 查看

source: 杨宗德-Linux高级程序设计-13章-page:329(evernote pdf)