调试时,发现
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();
}
}
}
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();
}
}
}
解决方案 »
- winform 中两个statusStrip的问题???急求~~~
- 求人解答!!
- 多线程问题
- 为什么我的VS2005老要进行保存自动恢复信息,烦死了,怎么去掉啊?
- 实例构造函数和静态构造函数啥区别?最好举例
- 问一个关于数据类型转换的问题,请达人帮忙解惑啊!!!
- 求 WebService 性能数据(可同时连接数量,并发请求数量) 谢谢
- 用api函数SendMessage向指定窗口发送单击消息 wParam 和lParam 参数怎么写?
- ???难度好大,各位进来看看
- Form中panel内用户控件1带参数传到用户控件2,panel中用户控件1释放并显示用户控件2
- c# 设置文件关联?急等!
- 分享自己写的动态绑定TreeView,非递归(做查询BOM的可以了解一下)
at System.Net.Sockets.Socket.Receive
at System.Net.Sockets.Socket.Receive哪位能否帮我优化下上面的代码或指导下哪个语句累赘?
你的套接字被远程强迫关闭,也就是说你的连接被断开了,你得做重连机制。从代码中可以看出你是在使用套接字来模拟Http请求,
你要注意一点:一个Http服务器,在你的连接超过指定时间没有任何动作的话,将会强制把你断开。你的循环代码写得有点问题:
Receive方法是阻塞性的,除非收到数据,否则一直阻塞住,除非你设置了超时,也就是说,recv在你的代码中永远不会返回0,你的循环将无法退出,直到服务器将你断开,引发异常