study notes: high performance linux server programming

1:linux网络API分为:socker地址API,socker基础API,网络信息API

  1,socker地址API:包含IP地址和端口(ip, port)。表示TCP通信的一端。

  2,socker基础API:创建/命名/监听socker,接收/发起链接,读写数据,获取地址信息,检测带外标记和读取/设置socker选项。sys/socket.h

  3,网络信息API:主机名和IP地址的转换,服务名和端口号的转换。netdb.h

2:socket和API的函数 和 相关知识。

  1,函数。

1 IP地址转换函数
  <arpa/inet.h>
  in_addr_t inet_addr( const char* strptr );  // 格式转换:十进制字符串IP -> 网络字节序(大端)IP
  int inet_aton( const char* cp, struct in_addr* inp );  // 格式转换:如上,但将数据保存到参数inp中
  char* inet_ntoa( struct in_addr in );  //  格式转换:网络字节序(大端)IP -> 十进制字符串IP
  int inet_pton( int af, const char* src, void* dst ); // 格式转换:字符串IP地址 -> 网络字节序(大端)整数IP
  const char* inet_ntop( int af, const void* src, char* dst, socklen_t cnt );  格式转换:网络字节序(大端)整数IP -> 字符串IP地址
  // inet_ntoa函数不可重入。
  // inet_ntop返回目标储存单元的地址。
2 创建socket
  <sys/types.h> <sys/socket.h>
  int socket( int domain, int type, int protocol );
  // 1 参数domain:使用的底层协议族。
  // 2 参数type:指定服务类型。SOCK_STREAM(TCP) SOCK_UGRAM(UDP)
  // 3 参数protocol:指定具体协议。一般默认为0.(前面参数已经确定了协议)
  // 4 返回:socket文件描述符。失败-1,设置errno
3 命名socket
  <sys/types.h> <sys/socket.h>
  int bind( int sockfd, const struct sockaddr* my_addr, socklen_t addrlen );
  // 1 参数addrlen:socket地址长度。
  // 2 返回:成功0,失败-1,设置errno
4 监听socket
  <sys/socket.h>
  int listen( int sockfd, int backlog );
  // 1 参数sockfd:指定被监听socket
  // 2 参数backlog:监听队列最大长度。典型值:5
5 接收链接。
  <sys/types.h> <sys/socket.h>
  int accept( int sockfd, struct sockaddr* addr, socklen_t* addrlen );
  // 1 参数sockfd:执行过listen的socket。
  // 2 参数addr:被接受链接的远程socket地址。
  // 3 参数addrlen:地址长度。
  // 4 返回:成功新的链接socket,失败-1设置errno
  // 5 accept只从监听队列取出连接,并不检测网络状态。
6 发起链接
  <sys/types.h> <sys/socket.h>
  int connect( int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen );
  // 1 参数sockfd:由socket系统调用返回一个socket
  // 2 参数serv_addr:服务器监听的socket地址。
  // 3 返回:成功0,失败-1设置errno
7 关闭连接
  <unistd.h>
  int close( int fd );
  // 1 不会立即关闭,只是将引用减一。只有引用为0时才会真正关闭。
  <sys/socket.h>
  int shutdown( int sockfd, int howto );
  // 1 立即关闭连接。
  // 2 参数howto:决定函数的行为。SHUT_RD/WR/RDWR:可以分别控制读写关闭。
  // 3 返回:成功0,失败-1设errno
8 TCP数据读写。
  <sys/types.h> <sys/socket.h>
  ssize_t recv( int sockfd, void* buf, size_t len, int flags );  // 返回:实际读取到的数据长度。失败-1errno
  ssize_t send( int sockfd, const void* buf, size_t len, int flags );  // 返回:实际写入的数据长度。失败-1reeno
  // 1 参数buf,len:缓冲区的地址和大小。
  // 2 参数flags:数据收发额外控制。通常设0.
9 UDP数据读写。
  <sys/types.h> <sys/socket.h>
  ssize_t recvfrom( int sockfd, void* buf, size_t len, int flags, struct sockaddr* src_addr, socklen_t *addrlen );
  ssize_t sendto( int sockfd, const void* buf, size_t len, int flags, const struct sockaddr* dest_addr, socklen_t *addrlen );
  // 1 参数src/dest_addr:确定发送/接收端地址。(因UDP没有连接概念)
  // 2 这两个函数同样可以应用于TCP读写数据。
10 通用数据读写函数。
  <sys/socket.h>
  ssize_t recvmsg( int sockfd, struct msghdr* msg, int flags );
  ssize_t sendmsg( int sockfd, struct msghdr* msg, int flags );
  struct msghdr{
    void* msg_name;             // socket 地址
    socklen_t msg_namelen;    // 地址长度
    struct iovec* msg_iov;      // 分散的内存块
    int msg_iovlen;             // 分散内存块的数量
    void* msg_control;      // 辅助数据地址
    socklen_t msg_controllen;   // 辅助数据大小
    int msg_flags;              // 保存函数flag参数
  }
11 确定下一个数据是否时带外数据。
  <sys/socket.h>
  int sockatmark( int sockfd );  // 返回:带外1,否则0
12 获取地址信息。
  <sys/socket.h>
  int getsockname( int sockfd, struct sockaddr* address, socklen_t* address_len );  // 本端
  int getpeername( int sockfd, struct sockaddr* address, socklen_t* address_len );  // 远端
  // 1 返回:成功0,失败-1errno
13 获取/设置socket选项
  <sys/socket.h>
  int getsockopt( int sockfd, int level, int option_name, void* option_value, socklen_t* restrict option_len );
  int setsockopt( int sockfd, int level, int option_name, const void* option_value, socklen_t* restrict option_len );
  // 1 参数level:具体协议选项。
  // 2 返回:成功0,失败-1errno。

// 此后为网络信息API
14 获取主机完整信息。
  <netdb.h>
  struct hostent* gethostbyname( const char* name );  // 通过主机名称获取
  struct hostent* gethostbyaddr( const void* addr, size_t len, int type );  //通过IP地址获取
  // 1 参数type:IP地址的类型。
  // 2 返回:主机信息。
15 获取服务的完整信息。
  <netdb.h>
  struct servent* getservbyname( const char* name, const char* proto );  // 通过名字获取
  struct servent* getservbyport( int port, const char* proto );  // 通过端口号获取
  // 1 参数proto:确定服务类型:UDP/TCP
16 获取主机和服务的综合函数。
  int getaddrinfo( const char* hostname, const char* service, const struct addrinfo* hints, struct addrinfo** result );
  int getnameinfo( const struct sockaddr* sockaddr, socklen_t addrlen, char* host, socklen_t hostlen, char* serv, socklen_t servlen, int flags );

  2,88-94在完成初版IM时,需要进行测试。

3:高级IO(高编已由函数省略)

  1,函数

1 两个文件描述符之间直接传递数据  ssize_t sendfile( int out_fd, int in_fd, off_t* offset, size_t count );  // 1 参数count:传输字节数  // 2 返回:成功返回传输字节数,失败-1errno  // 3 in_fd:必须时真实文件,out_fd:必须是socket2 两个文件描述符之间移动数据。零copy操作  ssize_t splice( int fd_in, loff_t* off_in, int fd_out, loff_t* off_out, size_t len, unsigned int flags );  // 具体需要再了解和使用。3 两个管道文件描述符之间复制数据。零copy操作  ssize_t tee( int fd_in, int fd_out, size_t len, unsigned int flags );4 

4:

5

6

7

8

9

10

时间: 2024-10-29 00:10:19

study notes: high performance linux server programming的相关文章

Machine Learning Algorithms Study Notes(2)--Supervised Learning

Machine Learning Algorithms Study Notes 高雪松 @雪松Cedro Microsoft MVP 2    Supervised Learning    3 2.1    Perceptron Learning Algorithm (PLA)    3 2.1.1    PLA -- "知错能改"演算法    4 2.2    Linear Regression    6 2.2.1    线性回归模型    6 2.2.2    最小二乘法( le

Machine Learning Algorithms Study Notes(1)--Introduction

Machine Learning Algorithms Study Notes 高雪松 @雪松Cedro Microsoft MVP 目 录 1    Introduction    1 1.1    What is Machine Learning    1 1.2    学习心得和笔记的框架    1 2    Supervised Learning    3 2.1    Perceptron Learning Algorithm (PLA)    3 2.1.1    PLA -- "知

Practical 1: HTTP Web Proxy Server Programming Practical

Practical 1: HTTP Web Proxy Server Programming PracticalDue Mar 29 by 17:00 Points 24Adapted from Kurose & Ross - Computer Networking: a top-down approach featuring the InternetCBOK categories: Abstraction, Design, Data & Information, Networking,

oracle 11gR2 client安装(Red Hat Enterprise Linux Server release 5.5 (Tikanga) 安装ORACLE客户端)

安装DBD::ORALCE模块时报错: Running Mkbootstrap for DBD::Oracle () chmod 644 Oracle.bs rm -f blib/arch/auto/DBD/Oracle/Oracle.so gcc -shared -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=gener

笔记本电脑玩linux server 笔记--优盘安装centos

手上有空闲的笔记本电脑,刚好想学习linux,于是便开始折腾之路.从自己的需求出发,希望可以达成目标:使用笔记本+有线网络搭建linux服务器,提供以下服务: 1.使用无线提供热点提供路由器的服务(在宿舍里充当无线路由器) 2.提供vpn服务(可以在校外访问只能在校内访问的资源) 3.搭建一个网站,供其他人浏览(没有域名,但是学校提供静态的个人主页,因此希望是通过个人主页的链接跳转到个人网站) 4.网站可以注册,可以玩ACM Online Judge,可以申请vpn服务等 5.没想好 自己毕竟新

在Azure上实现Linux Server故障转移

要充分利用公有云的弹性扩展和高可用, 首先要在应用系统层面支持横向扩展(scale out),这个说起来很容易,或者说对新开发的应用系统而言已经成为标配.但是对已有的.老旧的应用系统来说,这就比较困难了,不是每个应用系统都能实现/支持横向扩展的.从客户的角度来说,基本上很难接受为了把应用系统迁移到公有云上而去额外投入修改应用系统代码.虽然我们都心知肚明,本质上这是在“偿还技术债”,修改应用系统代码也是为了更好地利用公有云的优势... 对于应用系统的横向扩展而言,“状态”是最大的拦路虎,要支持横向

在虚拟机安装 Linux Server (ubuntu-14.04-server)

在虚拟机安装 Linux Server (ubuntu-14.04-server) 过程  从下载开始到安装成功历时约1小时 还算快的啦 可能国庆假期间网速快点吧 1. 下载安装文件 2. 创建虚拟机 3. 选择安装文件 4. 设置新账号 (root之外的) 6.虚拟机名称 文件位置 7 自动开始安装linux 8. 安装好后自动启动系统 9. 安装好的界面  可以登录 10. 修改 root 密码  可以 使用 sudo passwd 输入当前用户密码后修改root密码,再用su roo命令t

Red Hat Enterprise Linux Server release 7.0双系统安装

Red Hat Enterprise Linux Server release 7.0双系统安装 1.RedHat 公司的企业版7.0已经发布了.下面介绍一下在7.0下装双系统的步骤. 安装前系统:WIN7 要安装的第二个系统:RedHat Enterprise 7.0 @请注意:WIN8系统和企业版7.0不兼容.安装完7.0后,WIN8系统会起不来. @首先BOIS已经确定调好.[注意启用笔记本的高速运转模式],我是用PXE网络来安装的,所以还得设置从PXE网络启动. @接着以PXE启动. @

Red Hat Enterprise Linux Server 6.0官方多国语言版光盘镜像下载

来源:http://www.linuxidc.com/Linux/2011-09/43704.htm 电驴下载: rhel-server-6.0-i386-dvd.iso ed2k://|file|rhel-server-6.0-i386-dvd.iso|2931056640|503184dff4dd37542eee6e57f4a85341|h=azsa3gqbngp23ujbqeyc3ghd4wwtdley|/ ed2k://|file|HashTab_Setup.exe|799610|886