/// <summary> /// 关闭服务 /// </summary> /// <returns>是否关闭</returns> public int close() { int ret = -1; if (m_socket != null) { try { m_socket.Close(); ret = 1; } catch (Exception ex) { byte[] rmsg = new byte[1]; rmsg[0] = (byte)((char)2); FCClientSockets.recvClientMsg(m_hSocket, m_hSocket, rmsg, 1); FCClientSockets.writeClientLog(m_hSocket, m_hSocket, 2, "socket exit"); ret = -1; } } if (m_udpSocket != null) { try { m_udpSocket.Close(); ret = 1; } catch (Exception ex) { byte[] rmsg = new byte[1]; rmsg[0] = (byte)((char)2); FCClientSockets.recvClientMsg(m_hSocket, m_hSocket, rmsg, 1); FCClientSockets.writeClientLog(m_hSocket, m_hSocket, 2, "udp exit"); ret = -1; } } m_connected = false; return(ret); }
/// <summary> /// 保持活跃 /// </summary> /// <param name="socketID">套接字ID</param> /// <returns>状态</returns> public virtual int keepAlive(int socketID) { FCBinary bw = new FCBinary(); bw.writeInt((int)4); byte[] bytes = bw.getBytes(); int length = bytes.Length; int ret = FCClientSockets.send(socketID, bytes, length); bw.close(); return(ret); }
/// <summary> /// 发送消息 /// </summary> /// <param name="message">消息</param> public virtual int send(FCMessage message) { FCBinary bw = new FCBinary(); byte[] body = message.m_body; int bodyLength = message.m_bodyLength; int uncBodyLength = bodyLength; if (message.m_compressType == COMPRESSTYPE_GZIP) { using (MemoryStream cms = new MemoryStream()) { using (GZipStream gzip = new GZipStream(cms, CompressionMode.Compress)) { gzip.Write(body, 0, body.Length); } body = cms.ToArray(); bodyLength = body.Length; } } int len = sizeof(int) * 4 + bodyLength + sizeof(short) * 3 + sizeof(byte) * 2; bw.writeInt(len); bw.writeShort((short)message.m_groupID); bw.writeShort((short)message.m_serviceID); bw.writeShort((short)message.m_functionID); bw.writeInt(message.m_sessionID); bw.writeInt(message.m_requestID); bw.writeByte((byte)message.m_state); bw.writeByte((byte)message.m_compressType); bw.writeInt(uncBodyLength); bw.writeBytes(body); byte[] bytes = bw.getBytes(); int length = bytes.Length; int ret = FCClientSockets.send(message.m_socketID, bytes, length); m_upFlow += ret; bw.close(); return(ret); }
/// <summary> /// 运行 /// </summary> public void run() { byte[] str = null; bool get = false; int head = 0, pos = 0, strRemain = 0, bufferRemain = 0, index = 0, len = 0; int intSize = 4; byte[] headStr = new byte[4]; int headSize = 4; IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); //定义要发送的计算机的地址 EndPoint Remote = (EndPoint)(sender); // while (m_connected) { try { byte[] buffer = new byte[1024]; if (m_type == 0) { len = m_socket.Receive(buffer); } else if (m_type == 1) { m_udpSocket.ReceiveFrom(buffer, ref Remote); } if (len == 0 || len == -1) { byte[] rmsg = new byte[1]; rmsg[0] = (byte)((char)3); FCClientSockets.recvClientMsg(m_hSocket, m_hSocket, rmsg, 1); FCClientSockets.writeClientLog(m_hSocket, m_hSocket, 3, "socket error"); break; } index = 0; while (index < len) { int diffSize = 0; if (!get) { diffSize = intSize - headSize; if (diffSize == 0) { head = (((buffer[index] | (buffer[index + 1] << 8)) | (buffer[index + 2] << 0x10)) | (buffer[index + 3] << 0x18)); } else { for (int i = 0; i < diffSize; i++) { headStr[headSize + i] = buffer[i]; } head = (((buffer[0] | (buffer[1] << 8)) | (buffer[2] << 0x10)) | (buffer[3] << 0x18)); } if (str != null) { str = null; } str = new byte[head]; if (diffSize > 0) { for (int i = 0; i < headSize; i++) { str[i] = headStr[i]; } pos += headSize; headSize = intSize; } } bufferRemain = len - index; strRemain = head - pos; get = strRemain > bufferRemain; int remain = Math.Min(strRemain, bufferRemain); Array.Copy(buffer, index, str, pos, remain); pos += remain; index += remain; if (!get) { FCClientSockets.recvClientMsg(m_hSocket, m_hSocket, str, head); head = 0; pos = 0; if (len - index == 0 || len - index >= intSize) { headSize = intSize; } else { headSize = bufferRemain - strRemain; for (int j = 0; j < headSize; j++) { headStr[j] = buffer[index + j]; } break; } } } } catch (Exception ex) { break; } } byte[] rmsg2 = new byte[1]; rmsg2[0] = (byte)((char)2); FCClientSockets.recvClientMsg(m_hSocket, m_hSocket, rmsg2, 1); FCClientSockets.writeClientLog(m_hSocket, m_hSocket, 2, "socket exit"); m_connected = false; }
/// <summary> /// 发送消息 /// </summary> /// <param name="socketID">套接字ID</param> /// <param name="str">数据</param> /// <param name="len">长度</param> /// <returns>状态</returns> public static int sendByClient(int socketID, byte[] str, int len) { return(FCClientSockets.send(socketID, str, len)); }
/// <summary> /// 连接到服务器 /// </summary> /// <param name="proxyType">代理类型</param> /// <param name="ip">IP</param> /// <param name="port">端口</param> /// <param name="proxyIp">代理IP</param> /// <param name="proxyPort">代理端口</param> /// <param name="proxyUserName">用户名</param> /// <param name="proxyUserPwd">密码</param> /// <param name="proxyDomain">域</param> /// <param name="timeout">超时</param> /// <returns>状态</returns> public static int connectToServer(int proxyType, String ip, int port, String proxyIp, int proxyPort, String proxyUserName, String proxyUserPwd, String proxyDomain, int timeout) { FCClientSockets.setListener(new FCClientSocketListener()); return(FCClientSockets.connect(0, proxyType, ip, (short)port, proxyIp, (short)proxyPort, proxyUserName, proxyUserPwd, proxyDomain, timeout)); }
/// <summary> /// 连接服务器 /// </summary> /// <param name="ip">地址</param> /// <param name="port">端口</param> public static int connect(String ip, int port) { int socketID = FCClientSockets.connect(0, 0, ip, port, "", 0, "", "", "", 30000); return(socketID); }