diff --git a/README.txt b/README.txt index 0e3be67..50a18a4 100644 --- a/README.txt +++ b/README.txt @@ -1,132 +1,40 @@ -提供ssocket.h库文件以供在windows和linux帮助tcp-ipv4的实现 -未来将提供udp-ipv4及相应ipv6实现 - -版本号:1.0.2 - -测试用例: - 所有test用例使用cmake构建 - 在test文件夹下存在windows的可执行程序可用于测试 - (注意server文件忽略多线程资源竞争的问题,该问题将在未来解决) - -案例讲解: - 客户端伪代码解释: - 1.make_client_sock(); - 使用该函数创建面向服务器的套接字描述符 - 2.sock_connect(); - 判断make_client_sock返回值若表示连接服务器失败可以尝试用此函数重连 - 3.连接完成后可以使用recv和send互相通信(具体见后续讲解) - - 服务器伪代码解释: - 1.make_server_sock(); - 使用该函数创建服务器的套接字描述符 - 2.sock_accpet(); - 注意该函数为阻塞函数 - 当有客户端发起连接时该函数返回相应连接的客户端的套接字描述符 - 3.连接完成后可以使用recv和send互相通信(具体见后续讲解) - - recv和send函数讲解: - send函数的套接字描述符是向相应套接字发送内容 - recv同上,接收相应的内容 - 比如: - make_client_sock()返回的是连接到服务器的描述符,用于和服务器通信 - make_server_sock()返回的是服务器的描述符,用于监听自己是否被连接 - sock_accpet()返回的是连接进服务器的客户端的描述符,用于和连接的那个客户端通信 - sock_connect()用于改变连接到服务器的地址,同样用于和服务器通信 +提供ssocket.h库文件以提供在windows和linux使用通用函数用于更好的跨平台实现tcp-ipv4与tcp-ipv6(将来提供更多功能) +提供tthread.h库文件以提供在windows和linux使用通用函数用于更好的跨平台实现线程函数(将来提供更多功能) +版本见version.txt +测试用例: + 所有test用例使用cmake构建 函数文档: - void sleeps(int s) - 输入相应秒数,使相应线程暂停 - void sleepms(int ms) - 输入相应毫秒数,使相应线程暂停 - int make_sock(SOCKET* sock) - 作用: - 提供sock变量的地址以此创建一个用于通信的socket套接字描述符 - 返回值: + (函数文档全部采用markdown格式即*.md,可以使用VS打开) + 函数文档见doc.md - eg1. - SOCKET sock; - make_sock(&sock); - eg2. - SOCKET* psock = malloc(sizeof(SOCKET)); - if(psock == NULL) exit(-1); - make_sock(psock); - ... - free(psock); - 同理: - int make_sock_tcp4(SOCKET* sock); - int make_sock_tcp6(SOCKET* sock); - int make_sock_udp4(SOCKET* sock); - int make_sock_udp6(SOCKET* sock); - - int make_server_sock(SOCKET* sock, const char* server_ip, unsigned short port) - 作用: - 提供sock变量的地址,服务器的IP(若为NULL则默认为所有地址),服务器监听的端口号(0-65535) - 以此创建一个服务器的套接字描述符 - 返回值: - 若返回0则成功,否则失败 - 使用案例同make_sock +案例讲解: + 客户端伪代码解释: + 1.make_client_sock(); + 使用该函数创建面向服务器的套接字描述符 + 2.sock_connect(); + 判断make_client_sock返回值若表示连接服务器失败可以尝试用此函数重连 + 3.连接完成后可以使用recv和send互相通信(具体见后续讲解) + + 服务器伪代码解释: + 1.make_server_sock(); + 使用该函数创建服务器的套接字描述符 + 2.sock_accpet(); + 注意该函数为阻塞函数 + 当有客户端发起连接时该函数返回相应连接的客户端的套接字描述符 + 3.连接完成后可以使用recv和send互相通信(具体见后续讲解) - int make_client_sock(SOCKET* sock, const char* connect_ip, unsigned short port) - 作用: - 提供sock变量的地址,连接服务器的IP(若为NULL则默认为不启用初始化连接需要自己调用sock_connect),服务器监听的端口号(0-65535) - 以此创建一个客户端(面向服务器的)套接字描述符 - 返回值: - 若返回0则成功,否则失败 - 使用案例同make_sock + recv和send函数讲解: + send函数的套接字描述符是向相应套接字发送内容 + recv同上,接收相应的内容 + 比如: + make_client_sock()返回的是连接到服务器的描述符,用于和服务器通信 + make_server_sock()返回的是服务器的描述符,用于监听自己是否被连接 + sock_accpet()返回的是连接进服务器的客户端的描述符,用于和连接的那个客户端通信 + sock_connect()用于改变连接到服务器的地址,同样用于和服务器通信 - int sock_connect(SOCKET sock, const char* connect_ip, unsigned short port) - 作用: - 使用make_sock等系列函数返回的套接字,使其连接到目标IP/端口 - 用于客户端初始化,或者客户端重新连接新的服务器 - 返回值: - 若返回0则成功,否则失败 - - int sock_bindlisten(SOCKET sock, const char* server_ip, unsigned short port) - 作用: - 使用make_sock函数返回的套接字,绑定并监听自身IP/端口 - 用于服务器套接字初始化 - 返回值: - 若返回0则成功,否则失败 - - int sock_accpet(SOCKET sock,SOCKET* client, char** accept_ip, unsigned short* port) - 作用: - 用于服务器接收客户端的连接(阻塞函数) - 返回值: - 若返回0则成功,否则失败 - - void close_sock(SOCKET sock) - 作用: - 提供套接字描述符以此删除相关数据 - - void out_sock_err(FILE* output, int errcode) - 作用:暂时未提供 - - void get_sock_err(char* buff_128, size_t buff_len, int errcode) - 作用:暂时未提供 - - void sock_thread(void(*thread_func)(void*), void* data) - 作用: - 创建一个线程并执行线程函数 - eg. - void thread_func(void* data) { - //do someting - if(data != NULL) { - free(data); - } - } - - int main() { - int* data = malloc(sizeof(int)); - sock_thread(thread_func, data); - } - - -内置函数文档 -static inline int _socket(SOCKET* sock, const char* ip, const char* port); -static inline int _connect(SOCKET sock, const char* ip, const char* port); -static inline int _bind(SOCKET sock, const char* ip, const char* port); -static inline int _bindlisten(SOCKET sock, const char* ip, const char* port); - -static inline int _sock(SOCKET* sock, int af, int type); \ No newline at end of file + 线程函数伪代码解释: + thread_create + thread_mutex_init() \ No newline at end of file diff --git a/include/tthread.h b/include/tthread.h index d70dbaf..defef5d 100644 --- a/include/tthread.h +++ b/include/tthread.h @@ -25,7 +25,7 @@ typedef pthread_cond_t COND; #define ZZY_SLEEP #if _OS_WIN #define sleeps(s) Sleep(s*1000) - #define sleepms(ms) Sleep(ms) + #define sleepms(ms) Sleep(ms) #elif _OS_LINUX #define sleeps(s) sleep(s) #define sleepms(ms) usleep(ms*1000) @@ -219,9 +219,9 @@ static inline int thread_cond_timedwait(COND* cond, MUTEX* mutex, int ms) { if (res == WAIT_TIMEOUT) { return -ERR_THREAD_COND_TIME_OUT; } if (res == WAIT_FAILED) { return -ERR_THREAD_COND_TIMEDWAIT; } #elif _OS_LINUX - struct timespec outtime; - clock_gettime(CLOCK_MONOTONIC, &outtime); - outtime.tv_sec += ms/1000; + struct timespec outtime; + clock_gettime(CLOCK_MONOTONIC, &outtime); + outtime.tv_sec += ms/1000; outtime.tv_nsec += (ms % 1000) * 1000 * 1000; int res = pthread_cond_timedwait(cond, mutex, &outtime); if (res == ETIMEDOUT) { return -ERR_THREAD_COND_TIME_OUT; } diff --git a/version.txt b/version.txt index a34d7f9..1f7518d 100644 --- a/version.txt +++ b/version.txt @@ -1,16 +1,16 @@ v1.0.1 dev - 提供基础的windows与linux的跨平台tcp-ipv4协议 + 提供基础的windows与linux的跨平台tcp-ipv4协议 v1.0.2 dev - 使用getaddrinfo重写部分内容,为未来兼容tcp/udp-ipv4/ipv6做准备 - 添加make_sock,make_sock_tcp4,make_sock_tcp6,make_sock_udp4,make_sock_udp6函数 - 添加若干内置函数(以_func形式) - 兼容老版本 + 使用getaddrinfo重写部分内容,为未来兼容tcp/udp-ipv4/ipv6做准备 + 添加make_sock,make_sock_tcp4,make_sock_tcp6,make_sock_udp4,make_sock_udp6函数 + 添加若干内置函数(以_func形式) + 兼容老版本 v1.0.3 dev - 使用多头文件分离的方法将系统环境,线程,套接字分成三个文档 - 暂时兼容老版本,将在下个版本取消对前版本的兼容性 + 使用多头文件分离的方法将系统环境,线程,套接字分成三个文档 + 暂时兼容老版本,将在下个版本取消对前版本的兼容性 v1.0.4 alpha - 通过了Windows和Linux的基础测试(测试仅包括tcp-ipv4,tcp-ipv6,测试不完全) - 添加了tthread.h专用于Windows和Linux的线程函数,错误码方面函数未完工(注意可能低版本的Windows不支持) - 添加bkfifo.h为后续线程池函数做准备 - 添加各个函数的函数文档,重构README.txt - 取消部分函数兼容 \ No newline at end of file + 通过了Windows和Linux的基础测试(测试仅包括tcp-ipv4,tcp-ipv6,测试不完全) + 添加了tthread.h专用于Windows和Linux的线程函数,错误码方面函数未完工(注意可能低版本的Windows不支持) + 添加bkfifo.h为后续线程池函数做准备 + 添加各个函数的函数文档,重构README.txt + 取消部分函数兼容 \ No newline at end of file