我想了很长时间没明白为什么出错,希望大家帮我找找原因。这是我自定义的结构,客户端与服务端相同;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;
}
{
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;
}
用char [....].....