using System; using System.Text; using System.Collections.Generic; using System.Runtime.InteropServices; namespace ocean { public enum EMSocketStatus { SOCKET_DISCONNECTED = 0, //未连接 SOCKET_CONNECTED, //已连接 }; public class skt { /**************************************************** *Function: 初始化socket *Intput: NULL *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skt_init", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int init(); /**************************************************** *Function: 反初始化socket *Intput: NULL *Output: NULL *Return: NULL ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skt_deinit", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int deinit(); /**************************************************** *Function: 创建一个tcp 客户端,自动连接 释放对象时,自动关闭socket. *Intput: pszip 要连接的服务端ip sport 要连接的服务端端口 local 要绑定的本地ip,不需绑定传NULL即可 lport 要绑定的本地端口,不使用传0 *Output: NULL *Return: 失败返回INVALID_SKT, 成功返回skt句柄 *PS: 创建成功后调用skt_status可以查询是否连接ok ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "create_c", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int client(string pszip, ushort sport, string local = null, ushort lport = 0); /**************************************************** *Function: 创建一个tcp 服务端,并自动等待指定客户端连接 释放对象时,会自动关闭socket. *Intput: pszip 要绑定的服务端ip,可以传NULL sport 要绑定的服务端端口 local 指定客户端ip,不指定传NULL即可,即随机IP lport 指定客户端port,不指定传NULL即可,即随机port *Output: NULL *Return: 失败返回INVALID_SKT, 成功返回skt句柄 *PS: 创建成功后调用get_status可以查询是否连接ok ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "create_s", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int server(string pszip, ushort sport, string local = null, ushort lport = 0); /**************************************************** *Function: 关闭并释放一个skt句柄 *Intput: skt skt句柄 *Output: NULL *Return: 成功返回0,失败返回错误代码 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skt_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 = "skt_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 = "skt_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 = "skt_send", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int send(int skt, string pData, int len); /**************************************************** *Function: 接收消息函数,适用于客户端/服务端. *Intput: skt skt句柄 pData 接收数据缓冲区 len 能接收的最大数据长度 timeout 超时,默认无限等待,直到有消息 或者连接被关闭 *Output: pData 接收数据缓冲区 *Return: 成功返回接收到的数据长度,失败返回错误代码,不会返回0 ps:返回ERR_TIMEOUT表示没有消息可读,函数超时返回 ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skt_recv", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int recv(int skt, StringBuilder pData, int len, uint timeout = 0xFFFFFFFF); /**************************************************** *Function: 查询当前skt状态,适用于客户端/服务端. *Intput: skt skt句柄 *Output: NULL *Return: 参考SocketNetStatus ******************************************************/ [DllImport(@"skt.dll", EntryPoint = "skt_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 = "clear_msg", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int clear(int skt); } }