刚接触网络编程,问两个弱弱的问题,请高手指点。1.我用TcpClient接受数据是这样写的:
FileStream fs=new FileStream("received.data",FileMode.Create);
Stream stream=client.GetStream();
byte[] buffer=new byte[5120];
int recByte;
do
{
   recByte=stream.Read(buffer,0,buffer.Length);
   fs.Write(buffer,0,recByte);
}while(recByte>0);buffer我设置成的是5k时(注:发送数据buffer也是5k),我想请问,对于这个buffer大小的设置有没有什么特殊规定???!是不是太大了要掉包....太小了要怎么样呢???到底怎么设置这个buffer的大小合理呢?2.上面我用的do{}while循环,但是每当数据传完了,它跳不出这个循环,recByte好像始终不可能等于0,因为当没数据时,stream.read似乎一直在等待数据,所以recByte不可能等于0,那它就跳不出循环?请问怎么解决啊?

解决方案 »

  1.   

    Socket底层用系统的buffer.Socket.GetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.ReceiveBuffer);
    发送方Socket.ShutDown(); 
    Socket.Close();
      

  2.   

    大小没有规定
    read是堵塞的
    MSDN中有代码
    Read 方法将一直阻塞执行,直到从远程主机接收到数据并且数据在网络缓冲区中排队等待读取为止。如果要避免阻塞,请使用 DataAvailable 方法来确定该数据是否可用。如果 DataAvailable 为 true,则对 Read 的调用将立即返回。如果远程主机关机或关闭连接,则 DataAvailable 将引发 SocketException。[C#]  // Check to see if this NetworkStream is readable.
     if(myNetworkStream.CanRead){
         byte[] myReadBuffer = new byte[1024];
         String myCompleteMessage = "";
         int numberOfBytesRead = 0;     // Incoming message may be larger than the buffer size.
         do{
              numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);  
              myCompleteMessage = 
                  String.Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));  
         }
         while(myNetworkStream.DataAvailable);     // Print out the received message to the console.
         Console.WriteLine("You received the following message : " +
                                      myCompleteMessage);
     }
     else{
          Console.WriteLine("Sorry.  You cannot read from this NetworkStream.");
     }
      

  3.   

    http://www.cnblogs.com/pierce/category/22231.html
      

  4.   

    http://blog.csdn.net/JasonHeung/archive/2005/02/01/276170.aspx