资讯   |   开发   |   选机中心   |   产品大全 | IBM | 惠普 | 联想 | 戴尔 | 苹果 | 神舟
更多: | 华硕 | 明基 | 方正 | 紫光 | TCL | 夏新 | 联宝 | 宏碁 | 七喜 | 长城 | 清华同方 | 海尔 | 三星 | 东芝 | 索尼 | 富士通 | LG | 技术 | ddnoon
当前位置:笔记本 > 软件开发 >
Advertisement
文章正文

关于Socket的奇怪问题,头晕啊~~

类型:转载   责任编辑: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();  
  }  
  }  
  }  
 

网友回答:

发表者:einsteincao

二进制文件出错?  
   
  看看是不是防火墙开着

发表者:swiftlei

并发的问题吧?  
  你把从网站收到的HTML转发给浏览器的途中,因为有<img   src="等的内容,浏览器又会发送一次请求,请求转发src中的图片。而此时你的转发HTML的操作还没有结束就要接受转发图片的请求,或者因为类似的并发原因,导致你的程序出现并发错误了?单步调试时因为人的手指总没计算机反应快,故避免了并发也就避免了错误。

发表者:zyb_17flash

mark

发表者:schollc

是抛出一个System.FormatException异常吗?

发表者:effun

你对并发连接没有处理好。你的程序采用的是同步的方式,也就是说,循环执行一次必须要等到WEB服务器的响应全部转发到客户端以后才完成。  
  我觉得你可以考虑采用异步处理的方式,用BeginAccept(EndAccept),   BeginReceive(EndReceive)和BeginSend这些方法。异步处理比同步处理要稍微复杂一点,但比较稳定。  
  例子可以查阅以下地址:ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconusingnon-blockingserversocket.htm  
 


 

 
热门推荐笔记本: IBM笔记本
相关文章:
webmaster:popbb@126.com   最佳浏览:1024X768 MSIE
©2007 popbb.net All Rights Reserved