文章目录
Socket
网络/主机字节序转换
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
IP/网络字节序转换
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
int inet_pton(int af, const char *src, void *dst);
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp); /*ip点分式转网络字节序*/
in_addr_t inet_network(const char *cp);
char *inet_ntoa(struct in_addr in);
in_addr_t inet_lnaof(struct in_addr in);
in_addr_t inet_netof(struct in_addr in);
//将点分十进制ip转网络字节序可以直接:
myaddr.sin_addr.s_addr = inet_addr(INADDR_ANY);
//或
myaddr.sin_addr.s_addr = INADDR_ANY;
socket函数
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
bind函数
#include <sys/socket.h>
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
listen函数
#include <sys/socket.h>
int listen(int socket, int backlog);
<说明>:
允许同时连接数
accept函数
#include <sys/socket.h>
int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);
connect函数
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
recv()
参考:https://blog.csdn.net/mercy_ps/article/details/82224128
流程
nc/telnet命令
nc 和 telnet一样起到客户端的作用
nc ip port
或 telnet ip port
就可以连服务端
标准I/O
fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
从给定输入流stream读取最多count个size大小的对象到数组ptr中
返回成功读取的对象个数,若出现错误或到达文件末尾,则可能小于count。
fseek
int fseek( FILE *stream, long offset, int origin );
第一个参数stream为文件指针
第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
简言之:
fseek(fp,100L,0);把stream指针移动到离文件开头100字节处;
fseek(fp,100L,1);把stream指针移动到离文件当前位置100字节处;
fseek(fp,-100L,2);把stream指针退回到离文件结尾100字节处。
ftell
long ftell(FILE *stream);
函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。
使用fseek函数后再调用函数ftell()就能非常容易地确定文件的当前位置。
因为ftell返回long型,根据long型的取值范围-231~231-1(-2147483648~2147483647),故对大于2.1G的文件进行操作时出错。
使用:
利用函数 ftell() 也能方便地知道一个文件的长。如以下语句序列:
fseek(fp, 0L,SEEK_END);
len =ftell(fp);
首先将文件的当前位置移到文件的末尾,然后调用函数ftell()获得当前位置相对于文件首的位移,该位移值等于文件所含字节数。
进程
fork()
进程通信
flock
线程
线程概念及标识
- posix线程
- 线程标识:
pthread_t
ps axm
命令来查看线程
线程创建
/*比较tid*/
#include <pthread.h>
int pthread_equal(pthread_t t1, pthread_t t2);
/*获取当前线程标识*/
#include <pthread.h>
pthread_t pthread_self(void)
/*线程创建*/
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
/*
<说明>
<参数>:
参数1:回填tid
参数2:指定线程属性
参数3:线程函数返回值void*类型
参数4:线程函数的参数
<返回值>
*/
线程终止和栈清理
/*线程终止*/ #include <pthread.h> void pthread_exit(void *retval); /* <参数>: retval 返回给 join的 reval */
/*线程收尸*/ #include <pthread.h> int pthread_join(pthread_t thread, void **retval); /* <参数>: 参数2:状态 */
/*栈清理*/ #include <pthread.h> void pthread_cleanup_push(void (*routine)(void *), void *arg); void pthread_cleanup_pop(int execute);
线程取消
#include <pthread.h>
int pthread_cancel(pthread_t thread);
/*
<说明>:
回收一个正在运行的线程,先cancel,再join
<参数>:
线程id
<返回值>:
<补充>:
线程有两种取消选项
允许:
- 异步
- 推迟
不允许:
-
*/
include <pthread.h>
int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
/*
<说明>:
第一个设置是否取消
第二个设置取消方式
<>
*/
#include <pthread.h>
void pthread_testcancel(void);
/*
<说明>:
就是一个取消点什么也不做
*/
/*线程分离*/
#include <pthread.h>
int pthread_detach(pthread_t thread);
线程同步
互斥量
pthread_mutex_t
#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
条件变量
#include <pthread.h> int pthread_cond_destroy(pthread_cond_t *cond); int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr); pthread_cond_t cond = PTHREAD_COND_INITIALIZER;