예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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;
        }
예제 #5
0
 /// <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));
 }
예제 #6
0
 /// <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));
 }
예제 #7
0
        /// <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);
        }