我想了很长时间没明白为什么出错,希望大家帮我找找原因。这是我自定义的结构,客户端与服务端相同;struct FileInfo  // 文件信息
{
string fname;
string ftype;
string fsize;
string ftime;
};客户端线程中接收数据struct FileInfo m_FI;  //**对像*****************************
FD_ZERO(&readfds);
FD_SET(m_socket,&readfds);
for(int i = 0; i<m_firstdata.num; i++)  // m_firstdata.num 是文件的个数,由前一个recv接收到
{
   m_FI.fname.clear();  //**清零****************************
   m_FI.fsize.clear();
   m_FI.ftime.clear();
   m_FI.ftype.clear();   select(0,&readfds,NULL,NULL,NULL);
   mytcptran.myrecv(m_socket,(char*)&m_FI,sizeof(m_FI),0,60,NULL,0);
   /*收到数据后,m_FI.fname m_FI.fsize 正常接收。
     另两项输出窗口中显示“错误的指针”,调用它们时程序出错。*/   //以下是将数据赋给CListCtrl各项,当用“错误的指针”赋值中程序就挂
}
下面是服务端填充与发送结构的代码//列出目录下所有文件 "."与".."过滤掉
int FileList(const SOCKET &m_socket,const string &dir) // dir是路径
{
string m_dir;
for(unsigned int i = 0;i<dir.size();i++)
{
if(dir[i] == '\\')
{
m_dir +="\\";
}
else
m_dir +=dir[i];
}
m_dir +="*.*"; HANDLE hFile;
WIN32_FIND_DATA WFD;
//查找第一个文件
if((hFile = FindFirstFile(m_dir.c_str(),&WFD)) == INVALID_HANDLE_VALUE)
return 0;
SHFILEINFO shfi;
char stime[32];
SYSTEMTIME systime;
FILETIME localtime;
struct FirstData firstdata;  // 这是另一个数据结构,辅助作用
firstdata.num = 0;
firstdata.m_command = CMD_QJ;
struct FileInfo fileinfo;  // **创建对像****************************
memset(&fileinfo,0,sizeof(fileinfo));
vector<struct FileInfo>VFI;  // **使用vector************************ do
{
// 查完所有信息
memset(&shfi,0,sizeof(shfi));
SHGetFileInfo(WFD.cFileName,FILE_ATTRIBUTE_NORMAL,&shfi,sizeof(shfi),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME); if(strcmp(WFD.cFileName,".")==0||strcmp(WFD.cFileName,"..")==0)
continue;
if(GetLastError() == ERROR_NO_MORE_FILES)
break; //写文件信息结构
fileinfo.fname.clear();  //**清空********************************
fileinfo.fsize.clear();
fileinfo.ftime.clear();
fileinfo.ftype.clear();
fileinfo.fname = WFD.cFileName;  // 文件名 stringstream ss;  //** 下面是填充数据过程************************
ss<< (WFD.nFileSizeHigh*MAXDWORD+WFD.nFileSizeLow)/1024+1;  //文件大小
ss>>fileinfo.fsize;  FileTimeToLocalFileTime(&WFD.ftLastAccessTime,&localtime);
FileTimeToSystemTime(&localtime,&systime);
sprintf(stime,"%4d-%02d-%02d %02d:%02d:%02d",systime.wYear,systime.wMonth,systime.wDay,
systime.wHour,systime.wMinute,systime.wSecond);
fileinfo.ftime = stime;
switch(WFD.dwFileAttributes)
{
case FILE_ATTRIBUTE_ARCHIVE:
fileinfo.ftype +="文档:";
case FILE_ATTRIBUTE_COMPRESSED:
fileinfo.ftype +="压缩包:";
case FILE_ATTRIBUTE_DIRECTORY:
fileinfo.ftype +="文件夹:";
case FILE_ATTRIBUTE_SYSTEM:
fileinfo.ftype +="系统:";
case FILE_ATTRIBUTE_TEMPORARY:
fileinfo.ftype +="临时:";
case FILE_ATTRIBUTE_READONLY:
fileinfo.ftype +="只读:";
case FILE_ATTRIBUTE_HIDDEN:
fileinfo.ftype +="隐藏:";
case FILE_ATTRIBUTE_NORMAL:
fileinfo.ftype +="普通:";
default:fileinfo.ftype +="其它属性";
}
firstdata.num++;
VFI.push_back(fileinfo);  //** 用vector保存*************************
}while(FindNextFile(hFile,&WFD)); CMyTcpTran mytcptran;  //  一个TCP通信类
mytcptran.mysend(m_socket,(char*)&firstdata,sizeof(firstdata),0,60);  // 主要告诉客户端有多少个文件
for(int i = 0; i<firstdata.num; i++)  //** 将vector中的内容按文件一个个发送出去************
{
mytcptran.mysend(m_socket,(char*)&VFI[i],sizeof(VFI[i]),0,60);
} return 0;
}

解决方案 »

  1.   

    string其实就是一个类,类不能这么简单地被传送的,你要么先序列化,要么就直接以char[]的形式直接发送。
      

  2.   

    别说是从网络上传送了,就算同一个进程内,以string作为不同模块(DLL)的函数调用参数都有可能造成问题。
      

  3.   

    同意楼上,C++里 string 本身就是一个类,使用前需要实例化;另外使用char[]也需要分配内存,使用完毕后,别忘了释放已分配的内存。
      

  4.   

    sizeof(m_FI)是4个string对象的大小,而且无论结构成员取值多少sizeof(m_FI)得到的都是一样的结果.解决方法:把string改成char 数组
      

  5.   

    string不能简单的取地址来进行操作............
    用char [....].....