/// <summary>
        /// RGV连接
        /// </summary>
        /// <param name="strServer"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        public bool RGVConnect(string strServer, string port)
        {
            try
            {
                rg_Brun = false;
                if (string.IsNullOrEmpty(strServer) || port == "0")
                {
                    return(false);
                }

                IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(strServer), int.Parse(port));
                RgvCliSocket = TimeOutSocket.Connect(ipe, timeOut);

                if (RgvCliSocket != null && RgvCliSocket.Connected)
                {
                    NotifyEvent?.Invoke("RGVConnect", "连接成功");

                    rg_Brun = true;
                    Task.Run(RGVRcv);
                    return(true);
                }
                else
                {
                    NotifyEvent?.Invoke("Break", "连接失败!");
                    return(false);
                }
            }
            catch (SocketException ex)
            {
                NotifyEvent?.Invoke("Break", $"连接失败,异常:{ex.Message}");
                return(false);
            }
        }
示例#2
0
        /// <summary>
        /// WMS连接
        /// </summary>
        /// <param name="strServer"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        public bool WMSConnect(string strServer, string port)
        {
            try
            {
                wg_brun = false;
                if (string.IsNullOrEmpty(strServer) || port == "0")
                {
                    return(false);
                }

                IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(strServer), int.Parse(port));
                WMSCliSocket = TimeOutSocket.Connect(ipe, timeOut);

                if (WMSCliSocket != null)
                {
                    NotifyEvent?.Invoke("WMSConnect", "连接成功");

                    wg_brun = true;
                    ComTask = new Task(RGVRcv, TokenSource_ComTask.Token);

                    return(true);
                }
                else
                {
                    NotifyEvent?.Invoke("Break", "连接失败!");
                    return(false);
                }
            }
            catch (SocketException ex)
            {
                NotifyEvent?.Invoke("Break", $"连接失败,异常:{ex.Message}");
                return(false);
            }
        }
示例#3
0
        /// <summary>
        /// 以Socket测试的方式确认网络连接是否正常
        /// </summary>
        /// <param name="hostIP"></param>
        /// <param name="hostPort"></param>
        /// <returns></returns>
        public static bool CheckConnection(string hostIP, int hostPort)
        {
            bool bStatus = false;

            try
            {
                if (TimeOutSocket.Connect(hostIP, hostPort, 5000))
                {
                    bStatus = true;
                }
                Log.Info("[CheckConnection] ip=" + hostIP + " port=" + hostPort + " status=" + bStatus);
            }
            catch (System.Exception ex)
            {
                Log.Error("[GPRS][CheckNetStatus]Error!\n", ex);
                return(false);
            }
            return(bStatus);
        }
示例#4
0
        private static ServerInfo sendHTTPSRequest(int count, String host, int port, String payload, String request, int timeout, String encoding, Boolean foward_302, Boolean redirectDoGet)
        {
            Interlocked.Increment(ref HTTP.index);
            String    index = Thread.CurrentThread.Name + Interlocked.Read(ref HTTP.index);
            Stopwatch sw    = new Stopwatch();

            sw.Start();
            ServerInfo server           = new ServerInfo();
            Boolean    isupdateEncoding = false;
            int        sum = 0;

            TcpClient clientSocket = null;;

            try
            {
                if (port > 0 && port <= 65556)
                {
                    request = request.Replace(Main.setInjectStr, payload);

                    //编码处理
                    request = StringReplace.strReplaceCenter(main.config, request, main.replaceList);

                    TimeOutSocket tos = new TimeOutSocket();
                    clientSocket = tos.Connect(host, port, timeout);
                    if (sw.ElapsedMilliseconds >= timeout)
                    {
                        return(server);
                    }
                    clientSocket.SendTimeout = timeout - tos.useTime;

                    SslStream ssl = null;
                    if (clientSocket.Connected)
                    {
                        ssl = new SslStream(clientSocket.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate));
                        SslProtocols protocol = SslProtocols.Ssl3 | SslProtocols.Ssl2 | SslProtocols.Tls;
                        ssl.AuthenticateAsClient(host, null, protocol, false);
                        if (ssl.IsAuthenticated)
                        {
                            checkContentLength(ref server, ref request);
                            server.request = request;
                            byte[] requestByte = Encoding.UTF8.GetBytes(request);
                            ssl.Write(requestByte);
                            ssl.Flush();
                        }
                    }
                    server.request = request;
                    byte[] responseBody = new byte[1024 * 1024 * 10];
                    int    len          = 0;
                    //获取header头
                    String tmp = "";

                    StringBuilder sb      = new StringBuilder();
                    StringBuilder bulider = new StringBuilder();
                    clientSocket.ReceiveTimeout = timeout - (int)sw.ElapsedMilliseconds;
                    do
                    {
                        byte[] responseHeader = new byte[1];
                        int    read           = ssl.ReadByte();
                        if (read <= 0)
                        {
                            Thread.Sleep(WaitTime);
                        }
                        char c = (char)read;
                        sb.Append(c);
                        if (c.Equals(T))
                        {
                            tmp = String.Concat(sb[sb.Length - 4], sb[sb.Length - 3], sb[sb.Length - 2], c);
                        }
                    } while (!tmp.Equals(CTRL) && sw.ElapsedMilliseconds < timeout);

                    server.header = sb.ToString().Replace(CTRL, "");
                    String[] headers = Regex.Split(server.header, CT);
                    //处理header
                    doHeader(ref server, ref headers, ref encoding);
                    //302 301跳转
                    if ((server.code == 302 || server.code == 301) && foward_302)
                    {
                        StringBuilder rsb      = new StringBuilder(server.request);
                        int           urlStart = server.request.IndexOf(" ") + 1;
                        int           urlEnd   = server.request.IndexOf(" HTTP");
                        if (urlStart != -1 && urlEnd != -1)
                        {
                            String url = server.request.Substring(urlStart, urlEnd - urlStart);
                            rsb.Remove(urlStart, url.Length);
                            String location = server.headers["location"];
                            if (!server.headers["location"].StartsWith("/") && !server.headers["location"].StartsWith("http"))
                            {
                                location = Tools.getCurrentPath(url) + location;
                            }
                            location = location.Replace(" ", "%20");
                            rsb.Insert(urlStart, location);
                            String newReuqest = rsb.ToString();
                            if (rsb.ToString().StartsWith("POST") && redirectDoGet)
                            {
                                rsb.Remove(0, 4);
                                rsb.Insert(0, "GET");
                            }

                            return(sendHTTPSRequest(count, host, port, payload, rsb.ToString(), timeout, encoding, false, redirectDoGet));
                        }
                    }


                    //根据请求头解析
                    if (server.headers.ContainsKey(Content_Length))
                    {
                        int length = int.Parse(server.headers[Content_Length]);
                        //根据长度申请byte
                        responseBody = new byte[length];

                        while (sum < length && sw.ElapsedMilliseconds < timeout)
                        {
                            len = ssl.Read(responseBody, sum, length - sum);
                            if (len > 0)
                            {
                                sum += len;
                            }
                            if (len <= 0 && sum < length)
                            {
                                Thread.Sleep(WaitTime);
                            }
                        }
                    }
                    //解析chunked传输
                    else if (server.headers.ContainsKey(Transfer_Encoding))
                    {
                        //读取长度
                        int    chunkedSize = 0;
                        byte[] chunkedByte = new byte[1];
                        //读取总长度
                        sum = 0;
                        do
                        {
                            String ctmp = "";
                            do
                            {
                                len = ssl.Read(chunkedByte, 0, 1);
                                if (len <= 0)
                                {
                                    Thread.Sleep(WaitTime);
                                }
                                ctmp += Encoding.UTF8.GetString(chunkedByte);
                            } while (ctmp.IndexOf(CT) == -1 && sw.ElapsedMilliseconds < timeout);

                            chunkedSize = Tools.convertToIntBy16(ctmp.Replace(CT, ""));

                            //chunked的结束0\r\n\r\n是结束标志,单个chunked块\r\n结束
                            if (ctmp.Equals(CT))
                            {
                                continue;
                            }
                            if (chunkedSize == 0)
                            {
                                //结束了
                                break;
                            }
                            int onechunkLen = 0;

                            while (onechunkLen < chunkedSize && sw.ElapsedMilliseconds < timeout)
                            {
                                len = ssl.Read(responseBody, sum, chunkedSize - onechunkLen);
                                if (len > 0)
                                {
                                    onechunkLen += len;
                                    sum         += len;
                                }
                                if (len <= 0 && onechunkLen < chunkedSize)
                                {
                                    Thread.Sleep(WaitTime);
                                }
                            }

                            //判断
                        } while (sw.ElapsedMilliseconds < timeout);
                    }
                    //connection close方式或未知body长度
                    else
                    {
                        while (sw.ElapsedMilliseconds < timeout)
                        {
                            if (clientSocket.Client.Poll(timeout, SelectMode.SelectRead))
                            {
                                if (clientSocket.Available > 0)
                                {
                                    len = ssl.Read(responseBody, sum, (1024 * 200) - sum);
                                    if (len > 0)
                                    {
                                        sum += len;
                                    }
                                    else
                                    {
                                        Thread.Sleep(WaitTime);
                                    }
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                    }
                    //自动识别编码
                    if (AutoGetEncoding.Equals(encoding))
                    {
                        if (!String.IsNullOrEmpty(server.encoding))
                        {
                            encoding = server.encoding;//header找到编码
                        }
                        else
                        {
                            encoding         = DefaultEncoding; //默认一个编码
                            isupdateEncoding = true;            //body找编码
                        }
                        Encoding encod = Encoding.GetEncoding(encoding);
                        getBody(ref server, ref responseBody, ref sum, ref encod, ref index);
                        //修正编码
                        if (isupdateEncoding)
                        {
                            String cEncoding = getHTMLEncoding("", server.body);
                            if (!String.IsNullOrEmpty(cEncoding))
                            {
                                server.encoding = cEncoding;//body找到编码
                                getBody(ref server, ref responseBody, ref sum, ref encod, ref index);
                            }
                        }
                    }
                    else
                    {
                        //指定编码
                        Encoding encod = Encoding.GetEncoding(encoding);
                        getBody(ref server, ref responseBody, ref sum, ref encod, ref index);
                    }
                }
            }
            catch (Exception e)
            {
                Exception ee = new Exception("HTTPS发包错误!错误消息:" + e.Message + "----发包编号:" + index);
                if (ee.Message.IndexOf("doHeader") != -1)
                {
                    String a = e.Message;
                }
                throw ee;
            }
            finally
            {
                sw.Stop();
                server.length  = sum;
                server.runTime = (int)sw.ElapsedMilliseconds;

                if (clientSocket != null)
                {
                    clientSocket.Close();
                }

                if (main.config.isOpenHTTPLog)
                {
                    server.sleepTime = main.config.sendHTTPSleepTime;
                    Tools.sysHTTPLog(index, server);
                    main.Invoke(new Main.sendHTTPLogDelegate(main.sendHTTPLog), index, server, payload);
                }
                if (main.config.sendHTTPSleepTime > 0)
                {
                    Thread.Sleep(main.config.sendHTTPSleepTime);
                }
            }
            return(server);
        }
示例#5
0
        private static ServerInfo sendHTTPSRequest(int count, String host, int port, String payload, String request, int timeout, String encoding, Boolean foward_302, Boolean redirectDoGet)
        {
            Interlocked.Increment(ref HTTP.index);
            String    index = Thread.CurrentThread.Name + Interlocked.Read(ref HTTP.index);
            Stopwatch sw    = new Stopwatch();

            sw.Start();
            ServerInfo   server           = new ServerInfo();
            Boolean      isupdateEncoding = false;
            int          sum          = 0;
            Proxy        cproxy       = null;//当前使用代理
            TcpClient    clientSocket = null;;
            MemoryStream body_data    = new MemoryStream();

            try
            {
                if (port > 0 && port <= 65556)
                {
                    request = request.Replace(Main.setInjectStr, payload);

                    //编码处理
                    request = StringReplace.strReplaceCenter(main.config, request, main.replaceList);
                    TimeOutSocket tos = new TimeOutSocket();
                    if (main.config.proxy_mode == 1 || main.config.proxy_mode == 2)
                    {
                        if (main.config.proxy_mode == 1)
                        {
                            //随机代理
                            cproxy = getRandProxy();
                        }
                        else
                        {
                            cproxy = main.proxy;
                        }
                        //为空,没有代理资源
                        if (cproxy == null)
                        {
                            //不使用代理
                            try
                            {
                                clientSocket = tos.Connect(host, port, timeout);
                            }
                            catch (Exception)
                            {
                                Tools.SysLog(host + ":" + port + "无法连接!");
                            }
                        }
                        else
                        {
                            if (Socks5ProxyType.Equals(cproxy.proxyType))
                            {
                                SocketProxy sp   = new SocketProxy();
                                bool        isok = false;
                                clientSocket = sp.creatProxySocket(cproxy.host, cproxy.port, timeout);
                                if (clientSocket != null)
                                {
                                    isok = sp.ConnectProxyServer(host, port, clientSocket, cproxy.username, cproxy.password, timeout);
                                }
                                if (!isok)
                                {
                                    throw new Exception("代理连接失败!");
                                }
                                tos.useTime = sp.ConectProxyUseTime;
                            }
                            else
                            {
                                //直接替换IP和端口即可
                                clientSocket = tos.Connect(cproxy.host, cproxy.port, timeout);
                            }
                        }
                    }

                    else
                    {
                        try
                        {
                            clientSocket = tos.Connect(host, port, timeout);
                        }
                        catch (Exception)
                        {
                            Tools.SysLog(host + ":" + port + "无法连接!");
                        }
                    }

                    if (sw.ElapsedMilliseconds >= timeout)
                    {
                        return(server);
                    }


                    SslStream ssl = null;
                    if (clientSocket != null && clientSocket.Connected)
                    {
                        clientSocket.SendTimeout = timeout - tos.useTime;
                        ssl = new SslStream(clientSocket.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate));

                        //增加支持TLS1.1和TLS1.2支持3072,768
                        SslProtocols protocol = (SslProtocols)3072 | (SslProtocols)768 | SslProtocols.Tls | SslProtocols.Ssl3;
                        ssl.AuthenticateAsClient(host, null, protocol, false);
                        if (ssl.IsAuthenticated)
                        {
                            checkContentLength(ref server, ref request);
                            server.request = request;
                            //分开发送header和body,可以绕过某些情况下的安全防护Connection: close,不能使用这种方式
                            if (!server.reuqestHeader.ToLower().Contains(ConnectionClose))
                            {
                                String[] reqs = Regex.Split(request, "\r\n\r\n");
                                server.reuqestHeader = reqs[0];
                                server.reuqestBody   = reqs[1];
                                ssl.Write(Encoding.UTF8.GetBytes(server.reuqestHeader + "\r\n\r\n"));
                                ssl.Write(Encoding.UTF8.GetBytes(server.reuqestBody));
                            }
                            else
                            {
                                ssl.Write(Encoding.UTF8.GetBytes(request));
                            }
                            ssl.Flush();
                        }
                    }
                    server.request = request;
                    int len = 0;
                    //获取header头
                    String tmp = "";

                    StringBuilder sb = new StringBuilder();

                    clientSocket.ReceiveTimeout = timeout - (int)sw.ElapsedMilliseconds;
                    do
                    {
                        byte[] responseHeader = new byte[1];
                        int    read           = ssl.ReadByte();
                        if (read <= 0)
                        {
                            Thread.Sleep(WaitTime);
                        }
                        char c = (char)read;
                        sb.Append(c);
                        if (c.Equals(T))
                        {
                            tmp = String.Concat(sb[sb.Length - 4], sb[sb.Length - 3], sb[sb.Length - 2], c);
                        }
                    } while (!tmp.Equals(CTRL) && sw.ElapsedMilliseconds <= timeout);

                    server.header = sb.ToString().Replace(CTRL, "");
                    String[] headers = Regex.Split(server.header, CT);
                    //处理header
                    doHeader(ref server, ref headers, ref encoding);
                    //302 301跳转
                    if ((server.code == 302 || server.code == 301) && foward_302)
                    {
                        StringBuilder rsb      = new StringBuilder(server.request);
                        int           urlStart = server.request.IndexOf(" ") + 1;
                        int           urlEnd   = server.request.IndexOf(" HTTP");
                        if (urlStart != -1 && urlEnd != -1)
                        {
                            String url = server.request.Substring(urlStart, urlEnd - urlStart);
                            rsb.Remove(urlStart, url.Length);
                            String location = server.headers["location"];
                            if (!server.headers["location"].StartsWith("/") && !server.headers["location"].StartsWith("http"))
                            {
                                location = Tools.getCurrentPath(url) + location;
                            }
                            location = location.Replace(" ", "%20");
                            rsb.Insert(urlStart, location);
                            String newReuqest = rsb.ToString();
                            if (rsb.ToString().StartsWith("POST") && redirectDoGet)
                            {
                                rsb.Remove(0, 4);
                                rsb.Insert(0, "GET");
                            }

                            return(sendHTTPSRequest(count, host, port, payload, rsb.ToString(), timeout, encoding, false, redirectDoGet));
                        }
                    }


                    //根据请求头解析
                    if (server.headers.ContainsKey(Content_Length) && server.header.IndexOf(Content_Length_Zero) == -1)
                    {
                        int length = int.Parse(server.headers[Content_Length]);

                        while (sum < length && sw.ElapsedMilliseconds <= timeout)
                        {
                            int read = length - sum;
                            if (read > 1024)
                            {
                                read = 1024;
                            }
                            byte[] response_data = new byte[read];

                            len = ssl.Read(response_data, 0, read);

                            if (len > 0)
                            {
                                sum += len;
                                body_data.Write(response_data, 0, len);
                            }
                            if (len <= 0 && sum < length)
                            {
                                Thread.Sleep(WaitTime);
                            }
                        }
                    }
                    //解析chunked传输
                    else if (server.headers.ContainsKey(Transfer_Encoding))
                    {
                        //读取长度
                        int    chunkedSize = 0;
                        byte[] chunkedByte = new byte[1];
                        //读取总长度
                        sum = 0;
                        do
                        {
                            String ctmp = "";
                            do
                            {
                                len = ssl.Read(chunkedByte, 0, 1);
                                if (len <= 0)
                                {
                                    Thread.Sleep(WaitTime);
                                }
                                ctmp += Encoding.UTF8.GetString(chunkedByte);
                            } while (ctmp.IndexOf(CT) == -1 && sw.ElapsedMilliseconds <= timeout);

                            chunkedSize = Tools.convertToIntBy16(ctmp.Replace(CT, ""));

                            //chunked的结束0\r\n\r\n是结束标志,单个chunked块\r\n结束
                            if (ctmp.Equals(CT))
                            {
                                continue;
                            }
                            if (chunkedSize == 0)
                            {
                                //结束了
                                break;
                            }
                            int onechunkLen = 0;

                            while (onechunkLen < chunkedSize && sw.ElapsedMilliseconds <= timeout)
                            {
                                int read = chunkedSize - onechunkLen;
                                if (read > 1024)
                                {
                                    read = 1024;
                                }
                                byte[] response_data = new byte[read];

                                len = ssl.Read(response_data, 0, read);

                                if (len > 0)
                                {
                                    onechunkLen += len;
                                    sum         += len;
                                    body_data.Write(response_data, 0, len);
                                }
                                if (len <= 0 && onechunkLen < chunkedSize)
                                {
                                    Thread.Sleep(WaitTime);
                                }
                            }

                            //判断
                        } while (sw.ElapsedMilliseconds <= timeout);
                    }
                    //connection close方式或未知body长度
                    else
                    {
                        while (sw.ElapsedMilliseconds <= timeout)
                        {
                            bool isok = clientSocket.Client.Poll(timeout, SelectMode.SelectRead);
                            if (!isok || clientSocket.Available <= 0)
                            {
                                break;
                            }
                            else
                            {
                                int read = clientSocket.Available;
                                if (read > 0)
                                {
                                    byte[] response_data = new byte[read];
                                    len = ssl.Read(response_data, 0, read);
                                    if (len > 0)
                                    {
                                        sum += len;
                                        body_data.Write(response_data, 0, len);
                                    }
                                }
                                else
                                {
                                    Thread.Sleep(WaitTime);
                                }
                            }
                        }
                    }
                    //自动识别编码
                    if (AutoGetEncoding.Equals(encoding))
                    {
                        if (!String.IsNullOrEmpty(server.encoding))
                        {
                            encoding = server.encoding;//header找到编码
                        }
                        else
                        {
                            encoding         = DefaultEncoding; //默认一个编码
                            isupdateEncoding = true;            //body找编码
                        }
                        Encoding encod = Encoding.GetEncoding(encoding);
                        getBody(ref server, ref body_data, ref encod, ref index);
                        //修正编码
                        if (isupdateEncoding)
                        {
                            String cEncoding = getHTMLEncoding("", server.body);
                            if (!String.IsNullOrEmpty(cEncoding))
                            {
                                server.encoding = cEncoding;//body找到编码
                                getBody(ref server, ref body_data, ref encod, ref index);
                            }
                        }
                    }
                    else
                    {
                        //指定编码
                        Encoding encod = Encoding.GetEncoding(encoding);
                        getBody(ref server, ref body_data, ref encod, ref index);
                    }
                }
            }catch (Exception e)
            {
                Exception ee = new Exception("HTTPS发包错误!错误消息:" + e.Message + "----发包编号:" + index);
                throw ee;
            }
            finally
            {
                sw.Stop();
                server.length  = sum;
                server.runTime = sw.ElapsedMilliseconds;
                body_data.Close();
                if (clientSocket != null)
                {
                    clientSocket.Close();
                }

                if (main.config.isOpenHTTPLog)
                {
                    server.sleepTime = main.config.sendHTTPSleepTime;
                    Tools.sysHTTPLog(index, server);
                    String proxyInfo = "";
                    if (cproxy != null)
                    {
                        proxyInfo = cproxy.host + ":" + cproxy.port;
                    }
                    main.showHTTPLog(index, server, payload, proxyInfo);
                }
                if (main.config.sendHTTPSleepTime > 0)
                {
                    Thread.Sleep(main.config.sendHTTPSleepTime);
                }
            }
            return(server);
        }
示例#6
0
        //************************************************************************************************************************

        /// <summary>
        /// This function, send a socket to host and waiting data return
        /// </summary>
        /// <returns></returns>
        int SocketServerWR(string ServerIpAdrr, int ServerPort, string MsgToSend, ref string MsgRcv, ref string MsgErr)
        {
            try
            {
                //As request format of KV mode, we need attach vbCr at the end of MsgToSend
                MsgToSend = MsgToSend + "\r";

                //Check network connection
                if (CheckNetWorkPCconnectStatus(ServerIpAdrr) == false)
                {
                    MsgErr = "Error, cannot ping to: " + ServerIpAdrr.ToString();
                    return(9006); //Error code
                }

                //First we need check if Server exist or not. With timeout is 2 second!!!
                bool testBool = false;
                testBool = TimeOutSocket.TestTcpServerExist(ServerIpAdrr, ServerPort, 2000); //Timeout is 2 second

                //If server not exist. output message error and return error code
                if (testBool == false)
                {
                    MsgErr = "Cannot find server: " + ServerIpAdrr + "[" + ServerPort + "]";
                    return(9001); //Error code
                }


                //Create a TcpClient.
                //Note, for this client to work you need to have a TcpServer
                //connected to the same address as specified by the server, port combination.
                TcpClient client = new TcpClient(ServerIpAdrr, ServerPort);
                //Translate the passed message into ASCII and store it as a Byte array
                byte[] data = System.Text.Encoding.ASCII.GetBytes(MsgToSend);
                //Get a client stream for reading and writing
                NetworkStream stream = client.GetStream();

                //Delay alittle time?
                //System.Threading.Thread.Sleep(500);

                int  intRetryTimes = 0;
                bool blFlagSucess  = false;

                while ((intRetryTimes < 5) && (blFlagSucess == false))
                {
                    try
                    {
                        //Send the message to the connected TcpServer
                        stream.Write(data, 0, data.Length);
                        blFlagSucess = true; //Exit retry
                    }
                    catch (Exception ex1)
                    {
                        MsgErr = ex1.Message;
                        //return 9995; //Error code
                    }
                    intRetryTimes++;
                }

                if (blFlagSucess == false)
                {
                    return(9995); //Error code
                }


                //Receive the TcpServer.response.
                //Buffer to store the response bytes.
                data = new byte[1024];
                //String to store the response ASCII representation.
                string responseData = string.Empty;
                //Read the first batch of the TcpServer response bytes.

                int bytes = 0;
                intRetryTimes = 0;
                blFlagSucess  = false;
                while ((intRetryTimes < 5) && (blFlagSucess == false))
                {
                    try
                    {
                        bytes        = stream.Read(data, 0, data.Length);
                        blFlagSucess = true; //Exit retry
                    }
                    catch (Exception ex2)
                    {
                        MsgErr = ex2.Message;
                        //return 9996; //Error code
                    }
                    intRetryTimes++;
                }

                if (blFlagSucess == false)
                {
                    return(9996); //Error code
                }

                responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);

                MsgRcv = responseData;
                //Close everything
                stream.Close();
                client.Close();
                MsgErr = "";

                //If everything is OK. Then return OK code
                return(0);
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message, "SocketServerWR()");
                MsgErr = ex.Message;
                return(9000); //Error code
            }
        }
示例#7
0
        public void ConnectToServer(string Ip, string Port, string Account, string Password, string WarhammerDirectory)
        {
            Log.Info("ConnectToServer", "Attempt : " + Ip + ":" + Port);

            ///- Check the values we have
            if (WarhammerDirectory == "")
            {
                MessageBox.Show("Please choose the directory where WAR is installed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            IPAddress ipAddress;

            IPAddress[] Dnsresolve;
            try
            {
                if (IPAddress.TryParse(Ip, out ipAddress))
                {
                    ipAddress = IPAddress.Parse(Ip);
                }
                else
                {
                    Dnsresolve = Dns.GetHostAddresses(Ip);
                    ipAddress  = Dnsresolve[0];
                }
            }
            catch (Exception eIPAddress)
            {
                MessageBox.Show("Invalid Server IP address. Please review your settings file\n" + eIPAddress.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            ///- Connect to the Login Server
            TcpClient tcpClient;

            try
            {
                tcpClient = TimeOutSocket.Connect(new IPEndPoint(ipAddress, int.Parse(Port)), 4000); //Stop trying to connect after 7 secs
            }
            catch (Exception eConnect)
            {
                MessageBox.Show("Cannot connect to Login Server.\n" + eConnect.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            tcpClient.ReceiveTimeout = 5000; //Forget about reading after 5 seconds

            ///- Get the keybits
            MemoryStream toSend = new MemoryStream();

            try
            {
            }
            catch (Exception eLogin)
            {
                tcpClient.Close();
                MessageBox.Show("Cannot connect to Login Server.\n" + eLogin.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            string        ToEncode = Account + ":" + Password;
            SHA256Managed Man      = new SHA256Managed();

            byte[] Result    = Man.ComputeHash(ASCIIEncoding.ASCII.GetBytes(ToEncode));
            string AuthToken = BitConverter.ToString(Result).Replace("-", string.Empty);

            toSend.SetLength(0);
            toSend.Position = 0;

            try
            {
                NetworkStream ns = tcpClient.GetStream();

                toSend.WriteByte((byte)(4 + (4 + Account.Length) + (4 + AuthToken.Length)));
                toSend.WriteByte((byte)AuthOpcodes.CMSG_AUTHENTICATE);

                toSend.Write(new byte[] { 0, 0, 0, 1 }, 0, 4); // Sequence


                byte[] AccountSize = BitConverter.GetBytes((uint)Account.Length);
                Array.Reverse(AccountSize);
                toSend.Write(AccountSize, 0, 4);                                          // size of username
                toSend.Write(ASCIIEncoding.Default.GetBytes(Account), 0, Account.Length); // Unknown

                byte[] authResultSize = BitConverter.GetBytes((uint)AuthToken.Length);
                Array.Reverse(authResultSize);
                toSend.Write(authResultSize, 0, 4);                                           // size of username
                toSend.Write(ASCIIEncoding.Default.GetBytes(AuthToken), 0, AuthToken.Length); // Unknown

                toSend.WriteTo(ns);

                byte[] readBytes = new byte[(byte)PacketSize[(int)AuthOpcodes.SMSG_AUTHENTICATE_RESPONSE] + 2];
                int    left      = readBytes.Length;
                Log.Info("1", "13");
                while (left != 0) //that's brutal
                {
                    left -= ns.Read(readBytes, readBytes.Length - left, left);
                }
                Log.Info("1", "14");
                UInt16 response = BitConverter.ToUInt16(readBytes, 7);

                if (response == 14)
                {
                    tcpClient.Close();
                    MessageBox.Show("Account Suspended", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                if (response != 0)
                {
                    tcpClient.Close();
                    MessageBox.Show("Incorrect username or password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            catch (Exception eLogin)
            {
                tcpClient.Close();
                MessageBox.Show("Cannot connect to Login Server.\n" + eLogin.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            /// \todo here we could send the last packet to check if the password is correct before launching the game
            tcpClient.Close();
            Log.Info("1", "7");
            System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo();
            si.FileName = WarhammerDirectory + "\\war.exe";
            Log.Info("1", "8");
            si.WorkingDirectory = WarhammerDirectory;

            si.Arguments = "--acctname=" + EncodeTo64(Account) + " --authtoken=" + AuthToken;

            try
            {
                if (!UpdateWar(WarhammerDirectory))
                {
                    return;
                }
            }
            catch (Exception)
            {
            }

            try
            {
                System.Diagnostics.Process.Start(si);
            }
            catch (Exception eLaunch)
            {
                MessageBox.Show("Cannot launch the game client.\n" + eLaunch.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
示例#8
0
        /// <summary>
        /// 连接永诚socket,10秒内必须完成,否则超时处理
        /// </summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        private static string GetResponse(string xml)
        {
            string[]    config = System.Configuration.ConfigurationManager.AppSettings["YongChengIssuing"].Split(',');
            IPHostEntry ipHost = Dns.GetHostEntry(config[0].Trim());//域名转ip
            IPEndPoint  iep    = new IPEndPoint(ipHost.AddressList[0], int.Parse(config[1].Trim()));

            try
            {
                using (TcpClient tcpClient = TimeOutSocket.Connect(iep, Timeout.Infinite))
                {
                    using (NetworkStream netStream = tcpClient.GetStream())
                    {
                        StringBuilder myCompleteMessage = new StringBuilder();

                        if (netStream.CanWrite)
                        {
                            Byte[] sendBytes = Encoding.Default.GetBytes(xml);
                            netStream.Write(sendBytes, 0, sendBytes.Length);
                        }
                        else
                        {
                            throw new Exception("You cannot write data to this stream.");
                        }

                        if (netStream.CanRead)
                        {
                            byte[] myReadBuffer      = new byte[1024];
                            int    numberOfBytesRead = 0;

                            // Incoming message may be larger than the buffer size.
                            do
                            {
                                //try
                                {
                                    //若已过了前面connect阶段所设定的超时时间则该 Read 方法会报IOException
                                    numberOfBytesRead = netStream.Read(myReadBuffer, 0, myReadBuffer.Length);
                                }
                                //catch (System.IO.IOException ee)
                                //{
                                //    Common.LogIt(ee.ToString());
                                //    throw new Exception("与永诚核心数据传输超时,请稍后重新尝试。");
                                //}

                                myCompleteMessage.AppendFormat("{0}", Encoding.Default.GetString(myReadBuffer, 0, numberOfBytesRead));
                            }while (netStream.DataAvailable);
                        }
                        else
                        {
                            throw new Exception("Sorry.  You cannot read from this NetworkStream.");
                        }

                        return(myCompleteMessage.ToString());
                    }
                }
            }
            catch
            {
                Common.LogIt(iep.ToString());
                throw;
            }
        }