这段时间一直在研究socket发送原理,好不容易写出来一段接收发送的类,汗~~~,测试的时间发现主机发送文件给客户机时,客户机收到的文件名为空啊(只是弹出一个空白的对话框),没有弹出错误提示,请大家帮忙看看,是哪个地方出错了呢?不知道我有没有说的很明白。。
菜鸟高分跪求了,再不解决就要挂挂了。。client:struct fileData
{
public:
char filename[20];
char ffData[32*1024];
char len[50];
} fileClass;void CSocketClientDlg::OnRev()
{
memset(fileClass.ffData,0,32*1024);
memset(fileClass.filename,0,20);
memset(fileClass.len,0,50);char ch[100];sock.Receive((char FAR*)&fileClass,sizeof(fileClass),0);
if(fileClass.filename!=NULL)
{AfxMessageBox(fileClass.len);
}else
{AfxMessageBox("error");}server:void CSocketServerDlg::OnSend() 
{
// TODO: Add your control notification handler code here
 /*CString cstr="this is a test";  sock2.Send(cstr,cstr.GetLength());*/
CString cstr="d:\\1.exe";
CFile cfile;
int fileLength;  //文件长度
int finllyLength=0; //已发送的文件长度
// WSAGetLastError sockSenderror ; //发送错误类
int i=0;
    int count=0;
char buff[100]={0};
FILE *file;
char *ch="d:\\c#listview重绘.rar";
file=fopen(ch,"r+");
if(file==NULL)
{AfxMessageBox("打开文件失败");}
    while(!feof(file))
{
count=fread(buff,sizeof(char),1,file);  //每次读取 一个字节
fileLength++; //文件的长度
if(fileLength>32*1024)
{
AfxMessageBox("文件长度过长");
fclose(file);
break;
}
memcpy(&fileClass.ffData[i],buff,count);
        i+=count; 
} fileClass.ffData[i]='\0';
fclose(file);
strcpy(fileClass.filename,ch);
char *schar="hehe";  //测试用哦 strcpy(fileClass.len,schar);*/ int sendlength;
sendlength=sock2.Send(&fileClass,sizeof(fileClass),0);
// sendlength=send(sock2,(char *)&fileClass.ffData,sizeof(fileClass),0);
if(sendlength<=0)
{
AfxMessageBox("文件发送失败");
return;
}

解决方案 »

  1.   

    AfxMessageBox(fileClass.len);
    你好像不是弹出文件名称信息啊。
      

  2.   

    count=fread(buff,sizeof(char),1,file);  //每次读取 一个字节
    够晕的,干嘛每次读一个字节????不得累死啊?
      

  3.   

    你看一下 sendlength=sock2.Send(&fileClass,sizeof(fileClass),0);后,sendlength的值是多少。是否等于sizeof(fileClass)
      

  4.   

    sendlength=sock2.Send(&fileClass,sizeof(fileClass),0);后,sendlength的值是多少。是否等于sizeof(fileClass)  这两个值相等的。。
      

  5.   

    sock.Receive((char FAR*)&fileClass,sizeof(fileClass),0);
    这个语句的返回值是多少?
      

  6.   

    27780是27K,也就是你的sock一次传输的最大量是27K,即使你发送端一次发送超过27K,但由于接收端的缓冲区大小限制,只能分两次收完,所以你的程序不行。建议先用char*数组收完,然后再转换成你的数据结构。
      

  7.   

      嗯,谢谢你的帮忙啊。 你说先用char* 数组 ,这个要怎么改呢。麻烦你了。呵呵
      

  8.   

    本帖最后由 happyparrot 于 2010-12-15 13:38:35 编辑
      

  9.   

    上面有一点问题 memcpy(pBuf,nPos,ch,nSize-nPos-nCount);
    应该是memcpy(pBuf+nPos,ch,nSize-nPos-nCount);
    笔误了。
      

  10.   

    这句应该改成:memcpy(pBuf+nPos,ch,nSize-nPos);
      

  11.   

    你的数据结构的大小是32K+70,你发送时的sendlength值到底是多少?27K呢,还是32K+70?如果是后者,那么你测试的接收数据量 27880+1600好像不足32K啊。
      

  12.   


    sendlength的值是32838,接收的数据是分两次接收的,具体是多少记不清了。呵呵