diff --git a/doc.md b/doc.md index 699fe00..8aff3f2 100644 --- a/doc.md +++ b/doc.md @@ -10,30 +10,152 @@ #### socket套接字相关 +###### [`static inline int make_server_sock(SOCKET* sock, const char* server_ip, unsigned short port);`](./doc/document.md) + +初始化服务器类型的socket,推荐使用(使用内置函数优化效率,返回0表示成功 + + + +###### [`static inline int make_client_sock(SOCKET* sock, const char* connect_ip, unsigned short port);`](./doc/document.md) + +初始化客户端类型的socket,推荐使用(使用内置函数优化效率),返回0表示成功 + + + ###### [`static inline int sock_accpet(SOCKET sock,SOCKET* client, char** accept_ip, unsigned short* port);`](./doc/document.md) 将有效的套接字绑定并监听网络以提供套接字服务,返回0表示成功 -###### [`static inline int make_server_sock(SOCKET* sock, const char* server_ip, unsigned short port);`](./doc/document.md) +###### [`static inline int sock_connect(SOCKET sock, const char* connect_ip, unsigned short port);`](./doc/document.md) - - -###### [`static inline int make_client_sock(SOCKET* sock, const char* connect_ip, unsigned short port);`](./doc/document.md) +将有效的套接字连接到相应的套接字服务,用于客户端,返回0表示成功 ###### [`static inline void close_sock(SOCKET sock);`](./doc/document.md) +关闭套接字接口 + ###### [`static inline int make_server_sock_ex(SOCKET* sock, const char* server_ip, unsigned short port, struct addrinfo** resaddr);`](./doc/document.md) +初始化服务器类型的socket,推荐使用(使用内置函数优化效率),返回0表示成功 + ###### [`static inline int make_client_sock_ex(SOCKET* sock, const char* connect_ip, unsigned short port, struct addrinfo** resaddr);`](./doc/document.md) +初始化客户端类型的socket,推荐使用(使用内置函数优化效率),返回0表示成功 + + + +#### 内置函数 + +###### [`static inline int _getaddrinfo(struct addrinfo* inf, struct addrinfo** resaddr, const char* ip, const char* port);`](./doc/document.md) + +使用字符串自动匹配相应的信息,返回addrinfo(用于sockaddr),内部使用getaddrinfo系统函数生成addrinfo + +注意使用freeaddrinfo销毁resaddr + +返回0表示成功 + + + +###### [`static inline int _socket(SOCKET* sock, struct addrinfo* resaddr);`](./doc/document.md) + +使用addinfo创建socket套接字,内部使用socket系统函数(未加入Windows部分的初始化网络接口) + +返回0表示成功 + + + +###### [`static inline int _connect(SOCKET sock, struct addrinfo* resaddr);`](./doc/document.md) + +使用addinfo连接到服务器,内部使用connect系统函数 + +返回0表示成功 + + + +###### [`static inline int _bind(SOCKET sock, struct addrinfo* resaddr);`](./doc/document.md) + +使用addinfo绑定地址到socket套接字,用于服务器,内部使用bind系统函数 + +返回0表示成功 + + + +###### [`static inline int _bindlisten(SOCKET sock, struct addrinfo* resaddr);`](./doc/document.md) + +使用addinfo绑定并监听地址,用于tcp服务器,内部使用bind和listen系统函数 + +返回0表示成功 + + + +###### [`static inline int _accept(SOCKET sock, SOCKET* client, struct addrinfo* inf);`](./doc/document.md) + +使用已经绑定监听的套接字接口以接收客户端的连接客户端的信息返回在addrinfo中,用于tcp服务器,内部使用accept系统函数 + +返回0表示成功 + + + +###### [`static inline int _sock(SOCKET* sock, int af, int type);`](./doc/document.md) + +打开套接字接口(在Windows部分加入了初始化网络接口) + +返回0表示成功 + + + +#### 手动创建socket + +###### [`static inline int make_sock_tcp4(SOCKET* sock);`](./doc/document.md) + +初始化用于tcp-ipv4套接字接口,返回0表示成功 + + + +###### [`static inline int make_sock_tcp6(SOCKET* sock);`](./doc/document.md) + +初始化用于tcp-ipv6套接字接口,返回0表示成功 + + + +###### [`static inline int make_sock_udp4(SOCKET* sock);`](./doc/document.md) + +初始化用于udp-ipv4套接字接口,返回0表示成功 + + + +###### [`static inline int make_sock_udp6(SOCKET* sock);`](./doc/document.md) + +初始化用于udp-ipv6套接字接口,返回0表示成功 + + + +###### [`static inline int make_sock(SOCKET* sock);`](./doc/document.md) + +初始化套接字接口属于make_sock_tcp4的别名,返回0表示成功 + +不推荐,仅用于测试,将在未来版本删除 + + + +###### [`static inline int sock_bind(SOCKET sock, const char* server_ip, unsigned short port);`](./doc/document.md) + +将有效的套接字绑定网络以提供套接字服务,用于服务器,返回0表示成功 + + + +###### [`static inline int sock_bindlisten(SOCKET sock, const char* server_ip, unsigned short port);`](./doc/document.md) + +将有效的套接字绑定并监听网络以提供套接字服务,用于tcp服务器,返回0表示成功 + #### 错误处理(暂时未启用) @@ -46,136 +168,118 @@ -#### 内置函数 - -###### [`static inline int _getaddrinfo(struct addrinfo* inf, struct addrinfo** resaddr, const char* ip, const char* port);`](./doc/document.md) - - - -###### [`static inline int _socket(SOCKET* sock, struct addrinfo* resaddr);`](./doc/document.md) - - - -###### [`static inline int _connect(SOCKET sock, struct addrinfo* resaddr);`](./doc/document.md) - - - -###### [`static inline int _bind(SOCKET sock, struct addrinfo* resaddr);`](./doc/document.md) - - - -###### [`static inline int _bindlisten(SOCKET sock, struct addrinfo* resaddr);`](./doc/document.md) - - - -###### [`static inline int _accept(SOCKET sock, SOCKET* client, struct addrinfo* inf);`](./doc/document.md) - - - -###### [`static inline int _sock(SOCKET* sock, int af, int type);`](./doc/document.md) - - - -#### 手动创建socket - -###### [`static inline int make_sock_tcp4(SOCKET* sock);`](./doc/document.md) - - - -###### [`static inline int make_sock_tcp6(SOCKET* sock);`](./doc/document.md) - - - -###### [`static inline int make_sock_udp4(SOCKET* sock);`](./doc/document.md) - - - -###### [`static inline int make_sock_udp6(SOCKET* sock);`](./doc/document.md) - - - -###### [`static inline int make_sock(SOCKET* sock);`](./doc/document.md) - -初始化套接字接口,返回0表示成功 - -不推荐,仅用于测试,将在未来版本删除 - - - -###### [`static inline int sock_connect(SOCKET sock, const char* connect_ip, unsigned short port);`](./doc/document.md) - -将有效的套接字连接到相应的套接字服务,返回0表示成功 - - - -###### [`static inline int sock_bindlisten(SOCKET sock, const char* server_ip, unsigned short port);`](./doc/document.md) - -将有效的套接字绑定并监听网络以提供套接字服务,返回0表示成功 - -###### - ### 线程函数 tthread.h #### thread线程相关 ###### [`static inline int thread_create(TID* tid, void(*start_routine)(void*), void* arg);`](./doc/document.md) +创建线程,返回0表示成功 + ###### [`static inline void thread_exit(void);`](./doc/document.md) +退出当前线程 + ###### [`static inline int thread_join(TID tid);`](./doc/document.md) +等待线程结束,返回0表示成功 + ###### [`static inline TID thread_self(void);`](./doc/document.md) +获取当前线程的TID,返回0表示成功 + #### mutex互斥锁相关 ###### [`static inline int thread_mutex_init(MUTEX* mutex);`](./doc/document.md) +初始化mutex互斥锁,使其属于解锁状态,返回0表示成功 + ###### [`static inline int thread_mutex_destroy(MUTEX* mutex);`](./doc/document.md) +销毁mutex互斥锁,返回0表示成功 + ###### [`static inline int thread_mutex_lock(MUTEX* mutex);`](./doc/document.md) +等待mutex处于解锁状态并阻塞于此,若mutex为解锁状态则同一时刻有且仅有一个函数返回,且返回后mutex置为锁定状态 + +用于加锁 + +返回0表示成功 + ###### [`static inline int thread_mutex_unlock(MUTEX* mutex);`](./doc/document.md) +将处于锁定状态的mutex重置于解锁状态 + +用于解锁 + +返回0表示成功 + #### cond信号量相关 ###### [`static inline int thread_cond_init(COND* cond);`](./doc/document.md) +初始化cond信号量,并将其处于关闭状态,返回0表示成功 + ###### [`static inline int thread_cond_destroy(COND* cond);`](./doc/document.md) +销毁cond信号量,返回0表示成功 + ###### [`static inline int thread_cond_singal(COND* cond);`](./doc/document.md) +将信号量置于打开状态一次,即同一时刻有且仅有一个函数的信号量置于打开状态,返回0表示成功 + +(激活一个等待该条件cond的线程,存在多个等待线程时按入队顺序激活其中一个) + ###### [`static inline int thread_cond_broadcast(COND* cond);`](./doc/document.md) +使所有信号量处于打开状态,返回0表示成功 + +(激活所有等待cond的线程) + ###### [`static inline int thread_cond_wait(COND* cond, MUTEX* mutex);`](./doc/document.md) +等待从cond处于打开状态并一阻塞于此(实际是线程挂起) + +返回0表示成功 + +注意: mutex在调用thread_cond_wait()等系列函数前必须由本线程加锁 ([thread_mutex_lock()](./doc/document.md)), 而在更新条件等待队列以前, mutex保持锁定状态, 并在线程挂起进入等待前解锁. 在条件满足从而离开thread_cond_wait()之前, mutex将被重新加锁, 以与进 thread_cond_wait()前的加锁动作对应. 阻塞时处于解锁状态. + ###### [`static inline int thread_cond_timedwait(COND* cond, MUTEX* mutex, int ms);`](./doc/document.md) +请在此之前使用thread_mutex_lock,保证mutex处于使用状态 + +等待从cond处于打开状态并一阻塞于此(实际是线程挂起),若超出时间则直接返回并返回 -ERR_THREAD_COND_TIME_OUT; + +返回0表示成功 + +注意: mutex在调用thread_cond_wait()等系列函数前必须由本线程加锁 ([thread_mutex_lock()](./doc/document.md)), 而在更新条件等待队列以前, mutex保持锁定状态, 并在线程挂起进入等待前解锁. 在条件满足从而离开thread_cond_wait()之前, mutex将被重新加锁, 以与进 thread_cond_wait()前的加锁动作对应. 阻塞时处于解锁状态. + #### stdio标准函数的线程安全 diff --git a/test/thread/thread.c b/test/thread/thread.c index b350865..bfc4af4 100644 --- a/test/thread/thread.c +++ b/test/thread/thread.c @@ -52,17 +52,13 @@ int test2() { return -2; } } - //thread_mutex_lock(&mutex); tfprintf(&stdio, stdout, "press enter to continue\n"); if (getchar()); - //thread_mutex_unlock(&mutex); thread_cond_singal(&cond); sleeps(1); - //thread_mutex_lock(&mutex); tfprintf(&stdio, stdout, "press enter to continue\n"); if (getchar()); - //thread_mutex_unlock(&mutex); thread_cond_broadcast(&cond); for (int i = 0; i < MAX; i++) { @@ -76,13 +72,6 @@ int test2() { int main() { - //DWORD a[3] = { 1, 2, 3 }; - //LPDWORD p = a; - //printf("a[0] = %d, a[1] = %d, a[3] = %d\n", a[0], a[1], a[2]); - //printf("p[0] = %d, p[1] = %d, p[3] = %d\n", p[0], p[1], p[2]); - //printf("DWORD:%lld LPDWORD:%lld\n", sizeof(a), sizeof(p)); - //printf("DWORD:%lld LPDWORD:%lld long:%lld\n", sizeof(DWORD), sizeof(LPDWORD), sizeof(long)); - //return 0; int res; if (thread_mutex_init(&mutex) != 0) { return -1; @@ -93,7 +82,7 @@ int main() tfprintf(&stdio, stdout, "test1 start...\n"); res = test1(); if (res != 0) { - // return GetLastError(); + return res; } tfprintf(&stdio, stdout, "test1 end...\n"); @@ -103,7 +92,7 @@ int main() tfprintf(&stdio, stdout, "test2 start...\n"); res = test2(); if (res != 0) { - // return GetLastError(); + return res; } tfprintf(&stdio, stdout, "test2 end...\n"); if(getchar());