132 lines
5.2 KiB
Plaintext
132 lines
5.2 KiB
Plaintext
提供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()用于改变连接到服务器的地址,同样用于和服务器通信
|
||
|
||
|
||
|
||
函数文档:
|
||
void sleeps(int s)
|
||
输入相应秒数,使相应线程暂停
|
||
void sleepms(int ms)
|
||
输入相应毫秒数,使相应线程暂停
|
||
int make_sock(SOCKET* sock)
|
||
作用:
|
||
提供sock变量的地址以此创建一个用于通信的socket套接字描述符
|
||
返回值:
|
||
|
||
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
|
||
|
||
int make_client_sock(SOCKET* sock, const char* connect_ip, unsigned short port)
|
||
作用:
|
||
提供sock变量的地址,连接服务器的IP(若为NULL则默认为不启用初始化连接需要自己调用sock_connect),服务器监听的端口号(0-65535)
|
||
以此创建一个客户端(面向服务器的)套接字描述符
|
||
返回值:
|
||
若返回0则成功,否则失败
|
||
使用案例同make_sock
|
||
|
||
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); |