1. 多进程/多线程
1.1 进程
创建进程
/*在当前的进程中创建一个子进程*/
pid_t fork(void);
//返回值:父进程>0,子进程==0
获取进程ID
/*获取当前进程ID*/
pid_t getpid(void);
/*获取当前父进程ID*/
pid_t getppid(void);
退出进程
/*退出当前进程,并返回status*/
void exit(int status);
回收进程
/*回收所有子进程*/
pid_t wait(int *status);
//参数:status-记录了子进程退出的状态;
//返回值:成功被回收进程ID;失败-1;
/*回收指定进程*/
pid_t waitpid(pid_t pid, int *status, int options);
//参数:pid-要回收的进程id;status-回收进程退出状态;options-是否阻塞:0阻塞WNOHANG非阻塞。
//返回值:>0回收进程id; =0:options=WNOHANG时子进程还在运行; -1已无子进程待回收。
1.2 线程
创建线程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
获取线程ID
pthread_t pthread_self(void);
退出线程
void pthread_exit(void *retval);
结束线程
int pthread_cancel(pthread_t thread);
回收线程
int pthread_join(pthread_t thread, void **retval);
线程分离
int pthread_detach(pthread_t thread);
比较线程ID
int pthread_equal(pthread_t t1, pthread_t t2);
线程属性
pthread_attr_t t;
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_destroy(pthread_attr_t *attr);
2. 网络通信
2.2 TCP函数
字节序转换
uint16_t htons(uint16_t hostshort);
uint32_t htonl(uint32_t hostlong);
uint16_t ntohs(uint16_t hostshort);
uint32_t ntohl(uint32_t hostlong);
IP地址转换
int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
sockaddr数据结构
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef uint16_t in_port_t;
typedef uint32_t in_addr_t;
typedef unsigned short int sa_family_t;
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))
struct sockaddr
{
sa_family_t sa_family;
char sa_data[14];
}
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[sizeof (struct sockaddr) - (__SOCKADDR_COMMON_SIZE) - sizeof (in_port_t) - sizeof (struct in_addr)];
};
2.2 套接字函数
创建套接字
int socket(int domain, int type, int protocol);
绑定ip和端口
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
设置监听
int listen(int sockfd, int backlog);
等待连接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
客户端连接函数
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
读写数据
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
3. 多路IO转接
3.1 select函数
select
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
struct timeval
{
long tv_sec;
long tv_usec;
};
文件描述符表设置函数
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);epoll
3.2 epoll函数
创建epoll树
int epoll_create(int size);
管理epoll树
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
struct epoll_event
{
uint32_t events;
epoll_data_t data;
};
EPOLLIN - 读事件;
EPOLLOUT - 写事件;
EPOLLERR - 异常事件;
typedef union epoll_data
{
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
监测epoll树
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
4. openssl加密
4.1 哈希算法
散列值变量
int MD5_Init(MD5_CTX *c);
哈希运算
int MD5_Update(MD5_CTX *c, const void *data, unsigned long len);
生成散列值
int MD5_Final(unsigned char *md, MD5_CTX *c);
一次性哈希运算
unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md);
4.2 非对称加密
生成RSA密钥对
RSA *RSA_new(void);
BIGNUM *BN_new(void);
int BN_set_word(BIGNUM *e, unsigned int v);
int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
提取密钥
RSA *RSAPublicKey_dup(RSA *rsa);
RSA *RSAPrivateKey_dup(RSA *rsa);
密钥存到磁盘
int PEM_write_RSAPublicKey(FILE *fp, const RSA *r);
int PEM_write_RSAPrivateKey(FILE *fp, const RSA *r, const EVP_CIPHER* enc, unsigned char* kstr, int klen, pem_password_cb *cb, void* u);
BIO *BIO_new_file(const char *filename, const char *mode);
int PEM_write_bio_RSAPublicKey(BIO* bp, const RSA* r);
int PEM_write_bio_RSAPrivateKey(BIO* bp, const RSA* r, const EVP_CIPHER* enc, unsigned char* kstr, int klen, pem_password_cb *cb, void* u);
磁盘提取密钥
RSA* PEM_read_RSAPublicKey(FILE* fp, RSA** r, pem_password_cb *cb, void* u);
RSA* PEM_read_RSAPrivateKey(FILE* fp, RSA** r, pem_password_cb *cb, void* u);
BIO *BIO_new_file(const char *filename, const char *mode);
RSA* PEM_read_bio_RSAPublicKey(BIO* bp, RSA** r, pem_password_cb *cb, void* u);
RSA* PEM_read_bio_RSAPrivateKey(BIO* bp, RSA** r, pem_password_cb *cb, void* u);
非对称加密
int RSA_public_encrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding);
int RSA_private_decrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding);
int RSA_private_encrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding);
int RSA_public_decrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding);
签名验证
int RSA_sign(int type, const unsigned char *m, unsigned int m_length, unsigned char *sigret, unsigned int *siglen, RSA *rsa);
int RSA_verify(int type, const unsigned char *m, unsigned int m_length, const unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
4.3 对称加密
生成Key
int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
CBC加密
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t length, const AES_KEY *key, unsigned char *ivec, const int enc);