[toc]

- 格式转换

1. 字节序

网络上的字节序和本地的字节序是否相同

2. 地址转换

在ASCII字符串和网络字节序的数字地址之间的转换
可以通过以下函数进行:

  1. /* 仅适合IPv4 */
  2. #include <arpa/inet.h>
  3. int inet_aton(const char* strptr, struct in_addr* addr);
  4. int_addr_t inet_addr(const char* strptr);
  5. char* inet_ntoa(struct in_addr inaddr);
  6. /* 适合IPv4与IPv6 */
  7. #include <arpa/inet.h>
  8. int inet_pton(int family, const char* strptr, void* addrptr);
  9. const char* inet_ntop(int family, const void* addrptr, char* strptr, size_t len);

- 选择何种套接字

套接字地址结构:这个结构体用来存放连接的地址信息,比如IP地址和端口号等;以及指定套接字的协议类型。

- 字节操作函数

比如字节内存复制,比如内存全部置为0
常用两种类型的字节操作函数:

1. 源自BSD
  1. #include <strings.h>
  2. void bzero (void *s, size_t len);
  3. void bcopy(const void* src, void *dest, size_t len);
  4. int bcmp(const void* s1, const void* 2, size_t len);
  • bzero:将s的n个字节设置为0。
  • bcopy:从src复制n个字节到dest
  • bcmp:比较s1s2的n个字节是否相同。相同则返回0,不相同则返回非0。

    2. 源自ANSI C
    1. #include <string.h>
    2. void* memset(void* s, int c, size_t len);
    3. void* memcpy(void* dest, const void* src, size_t len);
    4. int memcmp(const void* s1, const void* s2, size_t len);
  • memset:将指定字节数设为c

    - 信号处理

    注意:阻塞的慢调用可能会被其他调用中断,从而出现EINTER错误。应该重启这些调用。
    在处理信号的过程中,新到来了同种信号,比如SIG_CHLD信号。如何做才能不至于错过处理这些信号。

    - 使用何种IO模型

    有4种IO模型可以使用

    1. 阻塞式

    一般需要子进程来处理到来的连接
    如果使用了子进程,就需要考虑以下方面

  • 处理SIG_CHLD信号

  • 管理通过父进程复制的一些资源:比如共享的描述符

    2. 非阻塞式
  • TODO

    3. IO复用

    选择使用select函数还是poll函数
    管理描述符集合

    4. 信号驱动
  • TODO

    - 使用缓冲

    注意:混合使用select和带有缓冲的流stdin可能会出错
    read, write上面使用缓冲可以显著减少用户CPU时间。

    - 其他注意

    1. 值-结果参数

    值结果参数是一种人为约定,而不是语法规范。它的实质是指针。
    以下图为例:
    _需要考虑的方面 - 图1
    在调用时,传入的len告诉内核结构体大小有多少,防止内核读写越界。
    在返回时,内核通过len告诉用户,自己往里写了多少内容。

    2. 客户端何时终止连接

    如果这个客户端将终端的内容发送到服务器。当终端输入EOF时,并不要终止客户端,因为客户端还要接收数据。