当前位置:编程学习 > C#/ASP.NET >>

c# socket通信接收数据包长,不能完整接收的问题

需要用一个socket程序,向网站发送数据包同步接收返回数据包,当网站响应数据短的没有问题,响应数据长的接收不完整。通过抓包发现,响应数据长的超过10个包,但程序只接收了前8个包,超过8个包的后面都没接收成功。大家帮看看问题,附代码:




        /// <summary>
        /// socket连接发送数据
        /// </summary>
        /// <param name="p_server"></param>
        /// <param name="p_content"></param>
        /// <returns></returns>
        public string socket(string p_server, string p_content)
        {

            string m_return = "";

            byte[] bytes = new byte[1024*64];

            try
            {
                // Establish the remote endpoint for the socket.
                IPHostEntry ipHostInfo = Dns.Resolve(p_server);

                IPAddress ipAddress = ipHostInfo.AddressList[0];

                IPEndPoint remoteEP = new IPEndPoint(ipAddress, 80);


                // Create a TCP/IP  socket.
                Socket sender = new Socket(AddressFamily.InterNetwork,
                                                SocketType.Stream, ProtocolType.Tcp);

                try
                {

                    sender.Connect(remoteEP);


                    ///记录向网关发送的记录数据包
                    ///

                    byte[] msg = Encoding.GetEncoding("utf-8").GetBytes(p_content);

                    // Send the data through the socket.
                    int bytesSent = sender.Send(msg);



                    // Receive the response from the remote device.
                    int bytesRec = sender.Receive(bytes);


                    //m_return = Encoding.ASCII.GetString(bytes, 0, bytesRec);
                    m_return = Encoding.GetEncoding("utf-8").GetString(bytes, 0, bytesRec);


                    // Release the socket.
                    sender.Shutdown(SocketShutdown.Both);

                    sender.Close();

                    return m_return;

                }
                catch (ArgumentNullException ane)
                {

                    sender.Close();

                    return "Error_01";

                }
                catch (SocketException se)
                {

                    sender.Close();

                    return "Error_02";
                }
                catch (Exception e)
                {

                    sender.Close();

                    return "Error_03";

                }

            }

            catch (Exception e1)
            {

                return "Error_socket!";

            }

            return m_return;


        }


--------------------编程问答-------------------- 发的太快了,没有响应过来

如果包有顺序,则编号,另外两端对于接收到包后,应该有个回复,再继续发

包头必须有大小,如果接受的数据比一个包多。则解析一个完整的包数据使用,剩下的保留和下次接受

的数据在组合一个包使用

其实主要是你两端沟通不够造成的,最好还是一问一答,比较安全。 --------------------编程问答-------------------- 对端是网站,响应的一个完整的HTTP数据包

从抓的包来看,每次都是前8个成功,到第9个就出问题 --------------------编程问答-------------------- 自己顶一下 --------------------编程问答-------------------- 分批接受  这个缓冲池   byte[] bytes = new byte[1024*1024]; 可以大大一点,不是解决问题的办法。 --------------------编程问答-------------------- 查看了csdn的一段代码解决了上面的问题,能完整接收了,不过又有了新问题。接收的过程中要等1分钟,每次请求都要等一分钟,大家看看这段怎么能优化。

                    do
                    {

                        

                        bytesRec = sender.Receive(bytes, bytes.Length, 0);

                        myFunction.WRITE_FILE("TEST.LOG", myFunction.getDateTime() + "||" + bytesRec.ToString());

                        m_return = m_return + Encoding.GetEncoding("utf-8").GetString(bytes, 0, bytesRec);

                    }

                    while (bytesRec > 0); --------------------编程问答-------------------- 看了一段微软的帮助代码,解决了上述问题。

不过又出现一个新问题,在循环等待接收的过程中,要等1分钟,这个设置怎么能改短些呢
 
                   do
                    {

                        

                        bytesRec = sender.Receive(bytes, bytes.Length, 0);

                        myFunction.WRITE_FILE("TEST.LOG", myFunction.getDateTime() + "||" + bytesRec.ToString());

                        m_return = m_return + Encoding.GetEncoding("utf-8").GetString(bytes, 0, bytesRec);

                    }

                    while (bytesRec > 0); --------------------编程问答-------------------- 还是不要分包的好
直接receive整个包(你一个包不会有几百兆吧) --------------------编程问答-------------------- do
{
bytesRec = sender.Receive(bytes, bytes.Length, 0);

myFunction.WRITE_FILE("TEST.LOG", myFunction.getDateTime() + "||" + bytesRec.ToString());

m_return = m_return + Encoding.GetEncoding("utf-8").GetString(bytes, 0, bytesRec);

}
while (bytesRec > 0);

循环接收了,但是每次循环要1分钟,这个时间设置怎么能改 --------------------编程问答-------------------- do
{
bytesRec = sender.Receive(bytes, bytes.Length, 0);

myFunction.WRITE_FILE("TEST.LOG", myFunction.getDateTime() + "||" + bytesRec.ToString());

m_return = m_return + Encoding.GetEncoding("utf-8").GetString(bytes, 0, bytesRec);

}
while (bytesRec > 0);

循环接收了,但是每次循环要1分钟,这个时间设置怎么能改 --------------------编程问答-------------------- 直接收的不完整,通过抓包发现从第9个开始丢的 --------------------编程问答-------------------- --------------------编程问答-------------------- 用socket处理HTTP协议麻烦啊
虽然HTTP底层也是TCP/IP协议
我也曾经使用socket下载HTML,碰到下面几种情况
1. 不能边接收边转换字符编码,因为可能HTML里有中文,有中文就有可能接收到半个中文的问题
2. Accept-Encoding,需要解密
3. 有Range的,需要自己算法组装


--------------------编程问答-------------------- 这些都还好,现在的问题是循环接收数据间隔了一分钟,这个怎样设置呢。


do
{
bytesRec = sender.Receive(bytes, bytes.Length, 0);

myFunction.WRITE_FILE("TEST.LOG", myFunction.getDateTime() + "||" + bytesRec.ToString());

m_return = m_return + Encoding.GetEncoding("utf-8").GetString(bytes, 0, bytesRec);

}
while (bytesRec > 0);
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,