using System; using System.Text; using System.Collections.Generic; using System.Runtime.InteropServices; namespace ocean { public class skts { /**************************************************** *Function: 初始化socket *Intput: NULL *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_init", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int init(); /**************************************************** *Function: 反初始化socket *Intput: NULL *Output: NULL *Return: NULL ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_deinit", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int deinit(); /**************************************************** *Function: 创建一个skts客户端,首次创建尝试连接一次 释放对象时,自动关闭. *Intput: pszdesc 要连接的服务端描述 长度<32 *Output: NULL *Return: 失败返回INVALID_SKT, 成功返回skts句柄 *PS: 创建成功后调用skts_status可以查询是否连接ok, 若未连接,每次调用skts_status都会尝试连接一次 *PS: 若需要创建tcp通信,则pszdesc格式:127.0.0.1:5000 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_client", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int client(string pszdesc); /**************************************************** *Function: 创建一个skts服务端,首次创建尝试连接一次 释放对象时,会自动关闭. *Intput: pszdesc 要绑定的服务端描述 长度<32 *Output: NULL *Return: 失败返回INVALID_SKT, 成功返回skts句柄 *PS: 创建成功后调用skts_status可以查询是否连接ok 若未连接,每次调用skts_status都会尝试接受连接一次 *PS: 相同IP相同端口建立的server会自动合并 *PS: 若需要创建tcp通信,则pszdesc格式:127.0.0.1:5000 *PS: 若按描述连接,则每个服务端只能接收一个客户端连接 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_server", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int server(string pszdesc); /**************************************************** *Function: 关闭并释放一个skt句柄 *Intput: skt skt句柄 *Output: NULL *Return: 成功返回0,失败返回错误代码 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_close", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int close(int skt); /**************************************************** *Function: 手动连接skt,设置手动连接模式时,使用此接口连接 *Intput: skt skt句柄 *Output: NULL *Return: 成功返回0,失败返回错误代码 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_conn", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int connect(int skt); /**************************************************** *Function: 断开一个skt连接,但不关闭句柄, *Intput: skt skt句柄 *Output: NULL *Return: 成功返回0,失败返回错误代码 *PS: 若未设置手动连接,则断开后会自动重连. ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_disconn", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int disconnect(int skt); /**************************************************** *Function: 发送消息函数,适用于客户端/服务端. *Intput: skt skt句柄 pData 要发送的数据 len 要发送的数据长度 *Output: NULL *Return: 成功返回发送成功的数据长度,失败返回错误代码 不会返回0 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_send", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int send(int skt, string pData, int len); /**************************************************** *Function: 发送消息函数,适用于客户端/服务端. *Intput: skt skt句柄 pData 要发送的数据 len 要发送的数据长度 *Output: NULL *Return: 成功返回发送成功的数据长度,失败返回错误代码 不会返回0 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_sends", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int sends(int skt, string pData); /**************************************************** *Function: 接收消息函数,适用于客户端/服务端. *Intput: skt skt句柄 pData 接收数据缓冲区 len 能接收的最大数据长度 timeout 超时,默认无限等待,直到有消息 或者连接被关闭 *Output: pData 接收数据缓冲区 *Return: 成功返回接收到的数据长度,失败返回错误代码,不会返回0 ps:返回ERR_TIMEOUT表示没有消息可读,函数超时返回 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_recv", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int recv(int skt, StringBuilder pData, int len, uint timeout = 0xFFFFFFFF); public static string recvs(int skt, uint timeout = 0xFFFFFFFF) { int ret = 0; StringBuilder psz = new StringBuilder(256); ret = recv(skt, psz, 256, timeout); return ret > 0 ? psz.ToString() : ""; } /**************************************************** *Function: 查询当前skt状态,适用于客户端/服务端. *Intput: skt skt句柄 *Output: NULL *Return: 参考SocketNetStatus ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_status", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int status(int skt); /**************************************************** *Function: 获取一个skt句柄对应的底层socket句柄 *Intput: skt skt句柄 *Output: NULL *Return: 失败返回INVALID_SKT, 成功返回soket句柄 *PS: 此句柄可以直接使用sysapi接口调用 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "get_socket", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int socket(int skt); /**************************************************** *Function: 获取一个skt对应的对端ip/port *Intput: skt skt句柄 *Output: lpRemote ip地址指针 可以传NULL pusport 端口指针 可以传NULL *Return: 成功返回0,失败返回错误代码 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "get_socket", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int addr(int skt,ref string lpRemote, ref ushort pusport); /**************************************************** *Function: 重置skt对应的消息缓冲区. *Intput: skt skt句柄 *Output: NULL *Return: 成功返回0,失败返回错误代码 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skts_clear", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int clear(int skt); } }