- 格式转换
1. 字节序
2. 地址转换
在ASCII字符串和网络字节序的数字地址之间的转换
可以通过以下函数进行:
/* 仅适合IPv4 */#include <arpa/inet.h>int inet_aton(const char* strptr, struct in_addr* addr);int_addr_t inet_addr(const char* strptr);char* inet_ntoa(struct in_addr inaddr);/* 适合IPv4与IPv6 */#include <arpa/inet.h>int inet_pton(int family, const char* strptr, void* addrptr);const char* inet_ntop(int family, const void* addrptr, char* strptr, size_t len);
- 选择何种套接字
套接字地址结构:这个结构体用来存放连接的地址信息,比如IP地址和端口号等;以及指定套接字的协议类型。
- 字节操作函数
比如字节内存复制,比如内存全部置为0
常用两种类型的字节操作函数:
1. 源自BSD
#include <strings.h>void bzero (void *s, size_t len);void bcopy(const void* src, void *dest, size_t len);int bcmp(const void* s1, const void* 2, size_t len);
bzero:将s的n个字节设置为0。bcopy:从src复制n个字节到destbcmp:比较s1和s2的n个字节是否相同。相同则返回0,不相同则返回非0。2. 源自ANSI C
#include <string.h>void* memset(void* s, int c, size_t len);void* memcpy(void* dest, const void* src, size_t len);int memcmp(const void* s1, const void* s2, size_t len);
-
- 信号处理
注意:阻塞的慢调用可能会被其他调用中断,从而出现
EINTER错误。应该重启这些调用。
在处理信号的过程中,新到来了同种信号,比如SIG_CHLD信号。如何做才能不至于错过处理这些信号。- 使用何种IO模型
1. 阻塞式
一般需要子进程来处理到来的连接
如果使用了子进程,就需要考虑以下方面 处理
SIG_CHLD信号-
2. 非阻塞式
-
3. IO复用
4. 信号驱动
-
- 使用缓冲
注意:混合使用
select和带有缓冲的流stdin可能会出错
在read, write上面使用缓冲可以显著减少用户CPU时间。- 其他注意
1. 值-结果参数
值结果参数是一种人为约定,而不是语法规范。它的实质是指针。
以下图为例:
在调用时,传入的len告诉内核结构体大小有多少,防止内核读写越界。
在返回时,内核通过len告诉用户,自己往里写了多少内容。2. 客户端何时终止连接
如果这个客户端将终端的内容发送到服务器。当终端输入EOF时,并不要终止客户端,因为客户端还要接收数据。
