/// <summary> /// 登陆行情服务器 /// </summary> /// <param name="_username">用户名称</param> /// <param name="_password">密码</param> /// <param name="_callbackIP">回掉的IP地址</param> /// <returns></returns> public bool Login(string _username, string _password, string _callbackIP) { UserName = _username; Password = _password; CallbackIP = _callbackIP; PDUHead pdh = new PDUHead(); pdh.setCommandId(PDUHead.JH_LOGIN); pdh.setStatus(0); pdh.setSvrTime(0); pdh.setTotalLength(PDUHead.PDU_HEAD_LEN + PDUHead.JH_LOGIN_LEN); byte[] head = pdh.ToByteArray(); byte[] body = pdh.LoginBody(_username, _password, _callbackIP); byte[] login = pdh.HeadAndBody(head, body); try { sock.Send(login); byte[] rspl = new byte[14]; int len = sock.Receive(rspl, PDUHead.PDU_HEAD_LEN, SocketFlags.None); if (len != PDUHead.PDU_HEAD_LEN) { JHLog.forMarketLog("登陆行情服务器失败!"); return(false); } PDUHead pDU = new PDUHead(); pDU.fromString(rspl); if (pDU.status != 0) { JHLog.forMarketLog("登陆行情服务器失败!"); return(false); } //登陆成功后消息推送给客户端 jhMarket.OnLogin(pDU.svrTime + ""); //启动行情接收线程 thread = new Thread(new ParameterizedThreadStart(ReceiveThread)); thread.Start(this); return(true); }catch (Exception ex) { JHLog.forMarketLog("登陆行情服务器失败!" + ex.Message); return(false); } }
public static Int32 WM_FQ_COMM_MSG = (0x0400 + 100 + 300 + 1); //socket通讯端口消息进入 //将字节数组转换成 PDUHead public static PDUHead byteToPDUHead(byte[] head) { if (head == null) { return(null); } PDUHead ph = new PDUHead(); int i = 0, j = 0; byte[] total = new byte[4]; total[i++] = head[j++]; total[i++] = head[j++]; total[i++] = head[j++]; total[i++] = head[j++]; Array.Reverse(total); i = 0; byte[] comm = new byte[4]; comm[i++] = head[j++]; comm[i++] = head[j++]; comm[i++] = head[j++]; comm[i++] = head[j++]; Array.Reverse(comm); i = 0; byte[] svrt = new byte[4]; svrt[i++] = head[j++]; svrt[i++] = head[j++]; svrt[i++] = head[j++]; svrt[i++] = head[j++]; Array.Reverse(svrt); i = 0; byte[] status = new byte[2]; status[i++] = head[j++]; status[i++] = head[j++]; Array.Reverse(status); ph.setTotalLength(BitConverter.ToInt32(total, 0)); ph.setCommandId(BitConverter.ToInt32(comm, 0)); ph.setSvrTime(BitConverter.ToInt32(svrt, 0)); ph.setStatus(BitConverter.ToInt16(status, 0)); return(ph); }
/// <summary> /// 线程处理函数 如果登陆成功后用来接收行情 /// </summary> /// <param name="obj"></param> public static void ReceiveThread(object obj) { SocketWorker sw = ((SocketWorker)obj); Socket sock = sw.getSocket(); byte[] bufferArr = new byte[2 * 1024]; //包体 byte[] PDUHeadArr = new byte[PDUHead.PDU_HEAD_LEN]; //数据长度 int totalLen = 0; //实际数据长度,初始为0 int readLen = 0; //读取的长度 try { for (; sock.Connected;) { //初始化缓存 Array.Clear(PDUHeadArr, 0, PDUHeadArr.Length); Array.Clear(bufferArr, 0, bufferArr.Length); //接收包头数据 int headBuf = PDUHead.PDU_HEAD_LEN; int headLeft = PDUHead.PDU_HEAD_LEN; int headOffset = 0; while (sock.Connected && headLeft > 0) { readLen = sock.Receive(PDUHeadArr, headOffset, headLeft, SocketFlags.None); if (readLen < 0) { throw new MarketException("接收行情包头数据异常!"); } if (readLen == 0) { break; } headOffset += readLen; headLeft -= readLen; } //判断接收的数据长度是否有误 readLen = headBuf - headLeft; //抛出异常 if (readLen != PDUHead.PDU_HEAD_LEN) { throw new MarketException("接收行情包头数据异常!"); } //解析头信息 PDUHead phed = PDUHead.byteToPDUHead(PDUHeadArr); //查看缓存区大小是否够用。 totalLen = phed.totalLength; if (totalLen > bufferArr.Length) { bufferArr = new byte[totalLen]; } //接收包体数据 int bodyBuf = totalLen - PDUHead.PDU_HEAD_LEN; int bodyLeft = totalLen - PDUHead.PDU_HEAD_LEN; int bodyOffset = 0; while (sock.Connected && bodyLeft > 0) { readLen = sock.Receive(bufferArr, bodyOffset, bodyLeft, SocketFlags.None);//读取socket数据 if (readLen < 0) { throw new MarketException("接收行情包体数据异常!"); } if (readLen == 0) { break; } bodyLeft -= readLen; bodyOffset += readLen; } readLen = bodyBuf - bodyLeft; //抛出异常 if (readLen != totalLen - PDUHead.PDU_HEAD_LEN) { throw new MarketException("接收行情包体数据异常!"); } //查看接收数据是否是行情数据 if (phed.commandId == PDUHead.JH_REALTRADEINFO) { Tick tck = Tick.byteToTick(bufferArr); if (tck == null) { throw new MarketException("解析行情数据包异常!"); } sw.GetJHMarket().ReturnTick(tck); sw.GetJHMarket().OnHeartTest(phed.svrTime); continue; } //查看数据是否是心跳数据 if (phed.commandId == PDUHead.JH_ACTIVETEST) { sw.GetJHMarket().OnHeartTest(phed.svrTime); continue; } } //异常 }catch (MarketException me) { sw.GetJHMarket().OnError("error@" + "Socket Worker Thread," + me.Message); JHLog.forMarketLog("Socket Worker Thread," + me.ToString()); return; } catch (Exception ex) { JHLog.forMarketLog("Socket Worker Thread," + ex.ToString()); return; } }