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#