receive的返回值就是实际上接受到的字节数,因为有可能实际上收到的字节数可能比recvBytes.Length小
send的返回值呢就是实际上发送到的字节数

解决方案 »

  1.   

    在面向连接中,收到的字节会不会比recvbytes.length小呢?
      

  2.   

    socket一直在接收数据,把收到的数据转成字符串recvStr,一般情况下再判断recvStr来取得所有要的信息。如果返回的值<=0,可能socket已经关闭,所以可以跳出循环了。send的返回值,代表本次发送出去的字节数。
      

  3.   

    那是不是说,send 和receive是一样的,他也并没有一次发送全部的数据。可能要传几次的?就象用receive,一次不能收到全部数据,要做一个循环来取得全部。我写了一个文件传输函数,下面是接收端的部分代码:
    private int FileTransfer(string FileName,string FilePath)
    {
    string AllFileName=FilePath+FileName;
    if (ComSocket==null||ComSocket.Available==0)
    {
    return -1;
    }
    if (Directory.Exists (FilePath)==false)
    {
    Directory.CreateDirectory (FilePath);
    }
    if (ComSocket.Poll (100,SelectMode.SelectRead)==true)
    {
    ///////////////First get size of file
    int RecvBytes=1;
    byte[] VlFileSize=new byte[16];

    RecvBytes=ComSocket.Receive (VlFileSize,0,VlFileSize.Length ,
    SocketFlags.None );
    RecvBytes=0;
    string StrFileSize=Encoding.ASCII .GetString (VlFileSize);
    StrFileSize=GetString(StrFileSize);
    long FileSize=Convert.ToInt32 (StrFileSize);
    this.SendInfo ("RCFLSIZE");
    ///////////////Transfer a file
    this.textstate.Text  ="File Transferring";
    byte[] FileBuffer=new byte [FileSize];
    byte[] TpBfFile=new byte[8];
    while (RecvBytes<FileSize )
    {
    int a=ComSocket.Receive (TpBfFile,0,
    TpBfFile.Length ,SocketFlags.None );
    Array.Copy (TpBfFile,0,FileBuffer,RecvBytes,a );
    RecvBytes+=a;

    }

    FileStream fs=File.Create (AllFileName);
    BinaryWriter bw=new BinaryWriter (fs);
    bw.Write (FileBuffer);
    bw.Close (); this.SendInfo ("RCFLTRANS");
    this.textstate.Text  ="Written Successfully";
    return 100;
    }
    return 2;
    }