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

every12555 2012-08-23 05:46:05
需要用一个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;


}


...全文
1022 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
every12555 2012-08-27
  • 打赏
  • 举报
回复
这些都还好,现在的问题是循环接收数据间隔了一分钟,这个怎样设置呢。


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);
Chasernet 2012-08-24
  • 打赏
  • 举报
回复
分批接受 这个缓冲池 byte[] bytes = new byte[1024*1024]; 可以大大一点,不是解决问题的办法。
every12555 2012-08-24
  • 打赏
  • 举报
回复
自己顶一下
SocketUpEx 2012-08-24
  • 打赏
  • 举报
回复
用socket处理HTTP协议麻烦啊
虽然HTTP底层也是TCP/IP协议
我也曾经使用socket下载HTML,碰到下面几种情况
1. 不能边接收边转换字符编码,因为可能HTML里有中文,有中文就有可能接收到半个中文的问题
2. Accept-Encoding,需要解密
3. 有Range的,需要自己算法组装


every12555 2012-08-24
  • 打赏
  • 举报
回复
直接收的不完整,通过抓包发现从第9个开始丢的
every12555 2012-08-24
  • 打赏
  • 举报
回复
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分钟,这个时间设置怎么能改
every12555 2012-08-24
  • 打赏
  • 举报
回复
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分钟,这个时间设置怎么能改
diecode 2012-08-24
  • 打赏
  • 举报
回复
还是不要分包的好
直接receive整个包(你一个包不会有几百兆吧)
every12555 2012-08-24
  • 打赏
  • 举报
回复
看了一段微软的帮助代码,解决了上述问题。

不过又出现一个新问题,在循环等待接收的过程中,要等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);
every12555 2012-08-24
  • 打赏
  • 举报
回复
查看了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);
every12555 2012-08-23
  • 打赏
  • 举报
回复
对端是网站,响应的一个完整的HTTP数据包

从抓的包来看,每次都是前8个成功,到第9个就出问题
isjoe 2012-08-23
  • 打赏
  • 举报
回复
发的太快了,没有响应过来

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

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

的数据在组合一个包使用

其实主要是你两端沟通不够造成的,最好还是一问一答,比较安全。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧