服务端和客户端通信,客户端接收信息不正确,为何?

振翅高飞 2012-06-29 03:03:29
求教:
为什么服务端函数发送的信息完好,而客户端函数接收的信息是错误的呢?

//客户端函数代码
int CClientDlg::UpdateList(const char* Path)
{
char strPath[MAX_PATH]={0};
char buff[15]={0};
SHFILEINFO shFinfo;
COMMAND cmd;
FILEINFO FileInfo;
int k;
ZeroMemory(&FileInfo,sizeof(FileInfo));
m_ListCtrl1.DeleteAllItems();

m_ListCtrl1.SetImageList(CImageList::FromHandle((HIMAGELIST)::SHGetFileInfo
((LPCTSTR)"C:\\",0,&shFinfo,sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX|SHGFI_LARGEICON)),LVSIL_NORMAL);
m_ListCtrl1.SetExtendedStyle(m_ListCtrl1.GetExtendedStyle()|
LVS_EX_FLATSB|LVS_EX_SUBITEMIMAGES|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);

cmd.msg=WM_GETDIRLIST;
strcpy(cmd.param1,Path);
if(SOCKET_ERROR==send(m_SockListen,(char *)&cmd,sizeof(cmd),0))
{
closesocket(m_SockListen);
return 0;
}
++SendNum;
int Ret=0,Val=0;
int num=0;
Val=recv(m_SockListen,buff,sizeof(buff),0);
if (Val!=SOCKET_ERROR)
{
num=atoi(buff);
for(k=0;k<num;++k)
{
Val=recv(m_SockListen,(char*)&FileInfo,sizeof(FileInfo),0); if(Val!=SOCKET_ERROR)
{
strcpy(strPath,Path);
if (strPath[strlen(strPath)-1]!='\\')
{
strcat(strPath,"\\");
}
strcat(strPath,FileInfo.FileName);
Ret=CClientDlg::GetIconIndex(strPath,SHGFI_ICON|SHGFI_SMALLICON);
m_ListCtrl1.InsertItem(0,FileInfo.FileName,Ret);
}
else
{
closesocket(m_SockListen);
break;
}
++RecvNum;
}
}
m_ListCtrl1.SetRedraw(TRUE);
return num;//返回列表项数
}



//服务端
BOOL File::GetDirectoryList(const char *Path,SOCKET s)
{//显示目录或者文件的图标,文件名等FileInfo
FILEINFO FileInfo[MAXCOUNT];
WIN32_FIND_DATA wfd;
char szText[MAX_PATH];
char DirName[MAX_PATH];
int k=0,Pos=0;
//先判断指定路径是目录还是文件。
if (GetFileAttributes((LPCTSTR)Path)&FILE_ATTRIBUTE_DIRECTORY)
{
sprintf(szText,"%s\\*.*",Path);
}
else
{
strcpy(szText,Path);
}
for (k=0;k<MAXCOUNT;++k)
{
ZeroMemory(&FileInfo[k],sizeof(FileInfo[k]));
}
HANDLE hFind = FindFirstFile(szText, &wfd);
char msg[]="获取目录列表信息失败!";
if (hFind == INVALID_HANDLE_VALUE)
{
if(SOCKET_ERROR==send(s,msg,sizeof(msg),NULL))
{
closesocket(s);
}
++SendNum;
return FALSE;
}
BOOL isNext=TRUE;
SHFILEINFO strFileInfo={0};
while(isNext)
{
if (wfd.cFileName[0]!='.')
{
strcpy(DirName,Path);
k=strlen(DirName);
if (DirName[k-1]!='\\')
{
strcat(DirName,"\\");
}
strcat(DirName,wfd.cFileName);
GetFileInfo(DirName,FileInfo[Pos]);//获取当前指定目录下遍历的文件或者目录的信息。
++Pos;
++SendNum;
}
isNext=FindNextFile(hFind,&wfd);
Sleep(10);
}
sprintf(szText,"%d",Pos);
if(SOCKET_ERROR==send(s,szText,sizeof(szText),0))
{
closesocket(s);
return FALSE;
}
for (k=0;k<Pos;++k)
{
if(SOCKET_ERROR==send(s,(char *)&FileInfo[k],sizeof(FileInfo[k]),0))
{
closesocket(s);
return FALSE;
}
}
return TRUE;
}


代码中红色是对应的,粉色是对应的。
红色部分是服务端发送一个数值告诉客户端用以客户端的下面的for循环的极限。
这部分传输正常。

粉色部分是服务端发送一个结构体FILEINFO,该结构体包含一些属性定义如下:
typedef struct
{
char FileName[MAX_PATH];
unsigned int FileLen;
char Time[60];
BOOL IsDir;
char Type[30];
char AttrScript[80];
BOOL Error;
HICON hIcon;
int iIcon;//系统图标的序列数或者索引
}FILEINFO;

服务端在发送FILEINFO之前,需要解析(服务端代码黄色部分),并且在调试过程中,该过程是正确的(这已确定),解析完毕,按照循环的方式发送给客户端。而客户端循环获取到的信息就是错误的,我实在想不出问题根源之所在,望大家帮忙指点一下。
...全文
152 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangxd09 2012-07-02
  • 打赏
  • 举报
回复

Socket/TCP粘包、多包和少包, 断包
wyx100 2012-07-02
  • 打赏
  • 举报
回复
回复于:2012-07-01 08:48:33LZ对TCP这个流式协议还不了解。

来自:
zhao4zhong1

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
振翅高飞 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
LZ对TCP这个流式协议还不了解。

来自:
zhao4zhong1

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
[/Quote]
朋友,能不能写的明白点?
别让人丈二和尚摸不着头。
zhanshen2891 2012-07-01
  • 打赏
  • 举报
回复
LZ对TCP这个流式协议还不了解。

来自:
zhao4zhong1

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
振翅高飞 2012-07-01
  • 打赏
  • 举报
回复
怎么没人回答吗?真郁闷。
振翅高飞 2012-06-29
  • 打赏
  • 举报
回复
CSDN,怎么搞的?代码颜色不能改?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧