Client端:
#define buffer 256*1024char temp[100];//
long subc;
while(1)
{
    //假定temp已赋值
    send(sockConn,temp,sizeof(temp),0);    //这里读取传过来的buffer数据
    recv(sockConn,subc,sizeof(subc),0);
    recv(sockConn,buffer,sizeof(buffer),0);}
Server端:
#define buffer 256*1024char  temp[100];
long subs ;
while( 1 )
{
    recv(sock,temp,sizeof(temp),0);    //根据subtemp的值读取磁盘中文件大小为256k数据赋值给buffer,
     //其中读取方式为file.Open(filepathname, CFile::modeRead|CFile::typeBinary, NULL);    send(sock,subs,sizeof(sub),0);
    int sum = 0;
    sum = send(sock,buffer,sizeof(buffer),0);
}现在问题是:
第一次循环:
客户端发送完temp给服务器,服务器根据temp读取数据赋值给buffer发送给客户端,
客户端接收到的字节数不是256k,而是其中的一部分。
回到第二次循环:
客户端接收的subc和buffer都是乱码。要怎么才能够保证客户端每次接收的数据正确????????

解决方案 »

  1.   

    你在每次Send之后Sleep(100)试试。
      

  2.   

    好像第一次对,第二次就不对,buffer是二进制的,看不到里面的值。
    我调试过,就传了buffer之后,后面传过来的值就乱码了。
    比如:客户端接收了第一个buffer之后,
          第二次客户端在接收buffer之前的subc的值是乱码来的。
    为什么会这样?????????有没有可能第一次接收的buffer,没有接收完,只是接收了一部分,就返回等待第二次接收。我看了这论坛的一些以前问的相关问题,自定义信息头,组包,粘包是怎么一回事?
      

  3.   

    tcp一次有没有最大的传输数据,是不是64k?
      

  4.   

    getsocketopt()看看接收缓冲区的大小。
    然后你每次recv()得看看返回值吧?
      

  5.   

    我看到了recv的每次返回值是73995个字节,大约72.26k,有没有设置socket的最大一次的接收值的tcp
      

  6.   

    做这种程序时,你必须先发送一个将要发送信息的大小,接收端申请空间,在发送
        //根据subtemp的值读取磁盘中文件大小为256k数据赋值给buffer, 
        //其中读取方式为file.Open(filepathname, CFile::modeRead|CFile::typeBinary, NULL); 
    发送端:
         // 发送大小
        send(sock,subs,sizeof(sub),0); 
        // 发送内容
        send(sock,buffer,sizeof(buffer),0); 
    接收端:
        // 接受大小
        int nSize;
        send(sock,nSize,sizeof(nSize),0); 
        char *szBuffer = new char(nSize);
        // 发送内容
        send(sock,szBuffer ,sizeof(szBuffer),0);