类型:转载 责任编辑:asp.net 日期:2007/05/23
热门软件下载:
小弟写了个小程序监听某个端口,当有浏览器发出请求就把请求发送给一个web服务器,再把web服务器的响应发给浏览器,有个奇怪的问题,就是转发图片、flash之类的二进制文件时出错,其他正常,还有就是如果在调试模式下单步运行,一切正常。是怎么回事,麻烦各位大侠给看一下,谢了
以下是主要代码:
this.sockListener=new Socket(AddressFamily.InterNetwork,
SocketType.Stream,ProtocolType.Tcp);
this.sockListener.Bind(this.myServer);
this.sockListener.Blocking=true;
this.sockListener.Listen(-1);
while(true)
{
this.connsock=this.sockListener.Accept();
if(this.connsock.Connected)
{
this.sockClient=new Socket(AddressFamily.InterNetwork,
SocketType.Stream,ProtocolType.Tcp);
this.sockClient.Connect(this.myClient);
try
{
byte[] buff=new byte[1024];
//从浏览器接收请求字符串
int bn=this.connsock.Receive(buff,buff.Length,0);
//发送到Web服务器
this.sockClient.Send(buff,buff.Length,0);
while(true)
{
byte[] content=new byte[1024];
//从Web服务器接收响应数据
int n=this.sockClient.Receive(content,content.Length,0);
if(n<=0)//接收完成关闭连接
{
this.sockClient.Close();
this.connsock.Close();
break;
}
//发送到浏览器
this.connsock.Send(content,content.Length,0);
}
}
catch(Exception ee)
{
sb.Text=ee.Message;
this.connsock.Close();
this.sockClient.Close();
}
}
}
网友回答:
二进制文件出错?
看看是不是防火墙开着
并发的问题吧?
你把从网站收到的HTML转发给浏览器的途中,因为有<img src="等的内容,浏览器又会发送一次请求,请求转发src中的图片。而此时你的转发HTML的操作还没有结束就要接受转发图片的请求,或者因为类似的并发原因,导致你的程序出现并发错误了?单步调试时因为人的手指总没计算机反应快,故避免了并发也就避免了错误。
mark
是抛出一个System.FormatException异常吗?
你对并发连接没有处理好。你的程序采用的是同步的方式,也就是说,循环执行一次必须要等到WEB服务器的响应全部转发到客户端以后才完成。
我觉得你可以考虑采用异步处理的方式,用BeginAccept(EndAccept), BeginReceive(EndReceive)和BeginSend这些方法。异步处理比同步处理要稍微复杂一点,但比较稳定。
例子可以查阅以下地址:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconusingnon-blockingserversocket.htm