问题描述:
上上个星期,给我安排了一个活。按照CMPP3.0.0协议文档,开发一个项目。
现在卡在和IMSG服务网关建立连接这块了。
用socket或tcpclient类中的Connect方法都是能连接上IMSG的IP和端口的。
但是,我发送按照协议中的CMPP_CONNECT消息时,当执行到BeginReceive方法时,就报异常"远程主机强迫关闭了一个现有的连接。"
我一开始以为是发送的数据格式上和协议里的有出入,但来回比对了几次,没发现哪有问题。
所以现在我已经卡死再这块了,不知道哪的原因,也解决不了。已经一周了,憋死我了!!!
下图是用TCPClient类来实现连接的代码 [客户端]:
1 TcpClient m_TcpClient = new TcpClient(); 2 m_TcpClient.ReceiveTimeout = m_TcpClient.SendTimeout = m_iTcpClientTimeout * 1000; 3 m_TcpClient.Connect(m_strAddress, m_iPort); 4 m_NetworkStream = m_TcpClient.GetStream(); 5 6 DateTime dt = DateTime.Now; 7 CMPP_CONNECT conn = new CMPP_CONNECT(); 8 conn.Head = new CMPP_HEAD(); 9 conn.Head.CommandID = CMPP30.CMD_CONNECT; 10 conn.Head.SequenceID = CreateSeqID(); 11 conn.SourceAddress = m_strSPID; 12 conn.TimeStamp = System.Convert.ToUInt32(string.Format("{0:MMddhhmmss}", dt)); 13 conn.AuthenticatorSource = CreateDigest(dt); 14 conn.Version = CMPP_VERSION_30; 15 16 byte[] bytes = conn.GetBytes(); 17 18 m_NetworkStream.Write(bytes, 0, (int)conn.Head.TotalLength); 19 20 // 等待 RESPONSE 5 秒。 21 int i; 22 for (i = 0; i < 5000 && !m_NetworkStream.DataAvailable; i += 10) 23 { 24 Thread.Sleep(10); 25 } 26 if (i >= 5000) 27 { 28 FireOnSMSStateChangedEvent(new SMSEventArgs(SMS_EVENT.SP_CONNECT_ERROR, "等待 CONNECT_RESP 超时", DateTime.Now)); 29 return false; 30 }
其中当运行到for循环判断时,就不行了,判断m_NetworkStream.DataAvailable状态时,始终都是false,最后就是提示"等待 CONNECT_RESP 超时"
不知道为什么NetworkStream流里没有可读(/可用)的数据,难道我没真正发到ISMG的服务器网关上吗?
希望有CMPP开发经验的前辈指点一二,在下感激不尽!!!
(要是有连接的代码做参考是最好的了!)
P.S. ISMG的意思是:互联网短信网关(CMPP3.0.0协议里有说明)
刚刚解决了,代码没问题。刚才又联系了下移动的人,他们那边给查了,发现是省移动那边之前没按照规范配置。。。坑啊!
感谢回复的网友们!
工作需求要弄CMPP3.0,上头安排的咱也没啥可说的,而且我也是第一次设计移动通信方面的项目.....
希望该贴多少也能帮助后来人!
您好,我先也是遇到了这个问题,自己不会开发,您这边能不能帮一下忙,有偿解决问题,如果您看到请联系一下我,qq1544229672,现在手上有源码,是用c++写的,
现在还有人在搞cmpp 3.0,都4G了
建议write后加一句代码:m_NetworkStream.flush();,好像是这个
前辈,请问能给我发个实现么?我也是第一次搞这个,没啥头绪