/********************************************************************* *文件说明: socket 封装类接口文件,所有对外接口都在这里定义 *作者: *日期: 2013/11/25 *修改日志: 2013/11/25 logos 创建 ***********************************************************************/ #pragma once #ifndef DLL_INCLUDE_SOCKET_SKT_H #define DLL_INCLUDE_SOCKET_SKT_H #ifndef EXPORT_C #define EXPORT_C extern "C" #endif #ifndef WINAPI #define WINAPI __stdcall #endif enum EMSktStatus { SOCKET_NOINIT = -1, //未初始化、不存在 SOCKET_DISCONNECTED = 0, //未连接 SOCKET_CONNECTED, //已连接 }; /**************************************************** *Function: 初始化模块 *Intput: NULL *Output: NULL *Return: 成功返回0 ******************************************************/ EXPORT_C int WINAPI skt_init(); /**************************************************** *Function: 释放模块 资源 *Intput: NULL *Output: NULL *Return: 成功返回0 ******************************************************/ EXPORT_C int WINAPI skt_deinit(); /**************************************************** *Function: 设置是否打印日志 *Intput: NULL *Output: NULL *Return: 成功返回0,失败返回错误代码 ******************************************************/ EXPORT_C int WINAPI skt_log(int bprint = 0); /**************************************************** *Function: 创建一个tcp客户端 *Intput: server 要连接的服务端ip port 要连接的服务端端口 local 要绑定的本地ip,不需绑定传NULL即可 lport 要绑定的本地端口,不使用传0 *Output: NULL *Return: 失败返回INVALID_SKT, 成功返回skt句柄 *PS: 创建成功后调用skt_status可以查询是否连接ok, 若未连接,每次调用skt_status都会尝试连接一次 ******************************************************/ EXPORT_C int WINAPI skt_client(const char* server, unsigned short port, const char* local = 0, unsigned short lport = 0); /**************************************************** *Function: 创建一个tcp服务端 *Intput: server 要绑定的服务端ip,可以传NULL port 要绑定的服务端端口 local 指定客户端ip,不指定传NULL即可,即随机IP lport 指定客户端port,不指定传NULL即可,即随机port *Output: NULL *Return: 失败返回INVALID_SKT, 成功返回skt句柄 *PS: 创建成功后调用skt_status可以查询是否连接ok 若未连接,每次调用skt_status都会尝试接受连接一次 *PS: 相同IP相同端口建立的server会自动合并 *PS: 不传入客户端IP时,首次连接断开后,重连会验证IP *PS: 传入客户端IP或者端口时,重连会验证IP以及端口相同 *PS: 重连为覆盖模式,即发现新连接时,会自动关闭旧连接,使用新连接 ******************************************************/ EXPORT_C int WINAPI skt_server(const char* server, unsigned short port, const char* local = 0, unsigned short lport = 0); /**************************************************** *Function: 关闭并释放一个句柄 *Intput: skt 句柄 *Output: NULL *Return: 成功返回0,失败返回错误代码 ******************************************************/ EXPORT_C int WINAPI skt_close(int skt); /**************************************************** *Function: 尝试连接/等待连接,适用于客户端/服务端. *Intput: skt 句柄 *Output: NULL *Return: 成功返回0,失败返回错误代码 *PS: 返回0表示已经连接ok ******************************************************/ EXPORT_C int WINAPI skt_conn(int skt); /**************************************************** *Function: 断开连接,但不关闭句柄, *Intput: skt 句柄 *Output: NULL *Return: 成功返回0,失败返回错误代码 ******************************************************/ EXPORT_C int WINAPI skt_disconn(int skt); /**************************************************** *Function: 清空消息缓冲区. *Intput: skt 句柄 *Output: NULL *Return: 成功返回0,失败返回错误代码 ******************************************************/ EXPORT_C int WINAPI skt_clear(int skt); /**************************************************** *Function: 查询当前状态,适用于客户端/服务端. *Intput: skt 句柄 *Output: NULL *Return: 参考EMSktStatus *PS: 若未连接,每次调用skt_status都会手动连接一次 ******************************************************/ EXPORT_C int WINAPI skt_status(int skt); /**************************************************** *Function: 发送消息函数,适用于客户端/服务端. *Intput: skt 句柄 pdata 要发送的数据 len 要发送的数据长度 *Output: NULL *Return: 成功返回发送成功的数据长度,失败返回错误代码 不会返回0 ******************************************************/ EXPORT_C int WINAPI skt_send(int skt, const char* pdata, int len); /**************************************************** *Function: 发送字符串消息函数,适用于客户端/服务端. *Intput: skt 句柄 pszdata 要发送的字符串数据 *Output: NULL *Return: 成功返回发送成功的数据长度,失败返回错误代码 不会返回0 ******************************************************/ EXPORT_C int WINAPI skt_sends(int skt, const char* pszdata); /**************************************************** *Function: 接收消息函数,适用于客户端/服务端. *Intput: skt 句柄 pdata 接收数据缓冲区 nsize 能接收的最大数据长度 timeout 超时,默认无限等待,直到有消息或者连接被关闭 *Output: pdata 接收数据缓冲区 *Return: 成功返回接收到的数据长度,失败返回错误代码,不会返回0 ps:返回ERR_TIMEOUT表示没有消息可读,函数超时返回 ******************************************************/ EXPORT_C int WINAPI skt_recv(int skt, char* pdata, int nsize, int timeout = 0xFFFFFFFF); /**************************************************** *Function: 设置/取消连接覆盖模式. -- 新连接将覆盖旧连接,不管旧连接是否ok *Intput: skt 句柄 bcover 1标识覆盖模式 0标识不使用覆盖模式,当前连接断开才会重连 *Output: NULL *Return: 成功返回0,失败返回错误代码 *PS: 理论上客户/服务端都可以用,但一般用于服务端,有新连接时替换旧连接。 *PS: 服务端覆盖将根据创建时传入的客户端IP地址及端口匹配重连, 若未传入,则使用首次连接的IP匹配,端口为0时不匹配端口 ******************************************************/ EXPORT_C int WINAPI skt_set_cover(int skt, int bcover = 1); /**************************************************** *Function: 获取一个skt句柄对应的底层socket句柄 *Intput: skt skt句柄 *Output: NULL *Return: 失败返回INVALID_SKT, 成功返回soket句柄 *PS: 此句柄可以直接使用sysapi接口调用 ******************************************************/ EXPORT_C int WINAPI skt_get_socket(int skt); /**************************************************** *Function: 获取一个skt对应的对端ip/port *Intput: skt 句柄 *Output: lpRemote ip地址指针 可以传NULL pusport 端口指针 可以传NULL *Return: 成功返回0,失败返回错误代码 ******************************************************/ EXPORT_C int WINAPI skt_get_addr(int skt, char* lpRemote = 0, unsigned short* pusport = 0); #endif //防止重复包含