调试C#时,遇到问题。

demo_online 2010-10-19 05:37:41
调试时,发现
recv = socket.Receive(data);
这句问题。

但又不知时什么问题?怎么解决?
会不会时数据溢出了?

namespace mydemo
{
class MyConnection
{
public void StartAccess( string urlStr ,int port , string path , string submitmethod, string postdata, TextBox list )
{
byte[] data = new byte[187385];

int datalen = postdata.Length;

IPHostEntry gist = Dns.GetHostEntry( urlStr );

//得到所访问的网址的IP地址
IPAddress ip = gist.AddressList[0];
IPEndPoint ipEnd = new IPEndPoint(ip, port);

//使用tcp协议 stream类型 (IPV4)
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);



try
{
socket.Connect(ipEnd);
}
catch(SocketException e)
{
MessageBox.Show("连接目标服务器失败。\n1、可能目标服务器已不可用。\n2、地址填写错误。");
Console.Write(e.ToString());
return;
}
//这里请求的相对地址,如果访问直接www.baidu.com则不需要,可以为空.

MessageBox.Show(Convert.ToString(datalen));

StringBuilder buf = new StringBuilder();
buf.Append(submitmethod+" ").Append("http://"+urlStr).Append(path).Append(" HTTP/1.1\r\n");
buf.Append("Host: "+urlStr+"\r\n");
buf.Append("Connection: keep-alive\r\n");
buf.Append("Referer: http://"+urlStr+path+"\r\n");
buf.Append("Content-Length: "+datalen+"\r\n");
buf.Append("Cache-Control: max-age=0\r\n");
buf.Append("Origin: http://"+urlStr+"\r\n");
buf.Append("Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n");
buf.Append("Content-Type: application/x-www-form-urlencoded\r\n");
buf.Append("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3\r\n");
buf.Append("Accept-Encoding: gzip,deflate,sdch\r\n");
//buf.Append("Accept-Language: zh-CN,zh;q=0.8\r\n");
buf.Append("Accept-Charset: utf-8\r\n");
//buf.Append("Cookie: rtime=0; ltime=1286510985674; cnzz_eid=53214426-1286510969-\r\n");
buf.Append("\r\n");
buf.Append(postdata);
buf.Append("\r\n");

byte[] ms = System.Text.UTF8Encoding.UTF8.GetBytes(buf.ToString());

//发送
socket.Send(ms);



int recv =0;

do
{
//下面这句有问题。
recv = socket.Receive(data);
//如果请求的页面meta中指定了页面的encoding为gb2312则需要使用对应的Encoding来对字节进行转换
list.Text += (Encoding.UTF8.GetString(data, 0, recv));
//list.Text += (Encoding.Default.GetString(data, 0, recv));


} while (recv != 0);

//禁用上次的发送和接受
socket.Shutdown( SocketShutdown.Both );
socket.Close();
}
}
}
...全文
151 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yudengchang 2010-10-24
  • 打赏
  • 举报
回复
调用的时候要做个判断的,判断是否连接正常,如果断开的话,就再次连接,这样就没有问题了,不可能等几天都在连接状态的.
bbb332 2010-10-24
  • 打赏
  • 举报
回复
学习学习。。。
demo_online 2010-10-24
  • 打赏
  • 举报
回复
这几天在处理公司其他的事情,一直没有留意到这,谢谢高手的指点,我先去修改有误的代码。
  • 打赏
  • 举报
回复
发送数据的时候,连接断了
卓才琣 2010-10-19
  • 打赏
  • 举报
回复
如果你做模拟Http请求的话,需要做Http头的分析,你请求服务器的时候,服务器会返回Http头,Http头和Http正文内容是使用两个回车换行符分开,通常情况下,Http头都会包含一个Content-Length的属性,你只要分析到这个属性之后,就可以很容易判断出什么时候数据接收完毕,主动断开连接,而不必等到服务器来强制断开
卓才琣 2010-10-19
  • 打赏
  • 举报
回复
这个很明显嘛,异常都说清楚了,
你的套接字被远程强迫关闭,也就是说你的连接被断开了,你得做重连机制。

从代码中可以看出你是在使用套接字来模拟Http请求,
你要注意一点:一个Http服务器,在你的连接超过指定时间没有任何动作的话,将会强制把你断开。

你的循环代码写得有点问题:
Receive方法是阻塞性的,除非收到数据,否则一直阻塞住,除非你设置了超时,也就是说,recv在你的代码中永远不会返回0,你的循环将无法退出,直到服务器将你断开,引发异常
游子 2010-10-19
  • 打赏
  • 举报
回复
路过。。。并顺便学习。。
air123456789 2010-10-19
  • 打赏
  • 举报
回复
发生套接字错误时引发的异常。

demo_online 2010-10-19
  • 打赏
  • 举报
回复
System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接。
at System.Net.Sockets.Socket.Receive
at System.Net.Sockets.Socket.Receive

哪位能否帮我优化下上面的代码或指导下哪个语句累赘?
Knife01055 2010-10-19
  • 打赏
  • 举报
回复
错误提示是什么啊
air123456789 2010-10-19
  • 打赏
  • 举报
回复
应该有错误代码的吧? 设置个断点,看他一步一步走,走到哪步错了,就知道错在哪了。

111,129

社区成员

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

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

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