Server:
byte[] buf = new byte[1024];
socket_client = socket_srv.Accept();
string str = "........";//str长度是3770;
socket_client.BeginSend(System.Text.Encoding.Default.GetByte(str),0,str.Length,......);
......client:
byte[] bufRecv = new byte[1024];
socket_client.BeginRecive(bufRecv,0,1024,SocketFlag.None,new AsyncCallBack(OnRecive),socket);
.....private void OnRecive(IAsyncResult ar)
{
   Scoket s_client = (Socket)ar.AsyncState;
   int nRecv = s_client.EndRecive(ar);
   //此时nRecv为1024,显然没有收完我的数据,我要怎么做才能继续收数据。
......
}

解决方案 »

  1.   

    http://topic.csdn.net/u/20080623/08/4BBD2475-45F1-42E3-A613-16B094759ADE.html
      

  2.   

    socket_client.BeginRecive(bufRecv,0,1024,SocketFlag.None,new AsyncCallBack(OnRecive),socket);
    LZ自己写的接收缓冲区大小为1024,怎么可能让它一次接受的数据大于1024Byte啊。建议LZ最好将发送的数据封装起来,规定一个格式,比如 消息头+消息长度+消息内容
    当客户端接收数据时,先接受到消息头,然后根据消息长度来判断数据接收是否完整,若不完整,接着调用socket.BeginReceive(……);
    代码类似这样。。private void OnRecive(IAsyncResult ar)
    {
      Scoket s_client = (Socket)ar.AsyncState;
      int nRecv = s_client.EndRecive(ar);  //根据bufRecv里面消息长度 来决定是否需要 再次 socket.BeginReceive();
      if(是)
      {
         socket_client.BeginRecive(bufRecv,0,1024,SocketFlag.None,new AsyncCallBack(OnRecive),socket);
      }
    }
      

  3.   

    你要判断ar是否Complete
    while(ar.IsCompleted)
    {
    Scoket s_client = (Socket)ar.AsyncState;
      int nRecv = s_client.EndRecive(ar);
    }
      

  4.   

    我的意思是BeginRecevie里面会有一个byte[] buff参数,我这个参数指定的大小是1024,但实际传输过来的数据有2048,我是收到1024后继续BeginRecevie吗?
    endrecevie里面会收到上一次2048里面的后1024字节数据吗?