首页
社区
课程
招聘
[求助]文件名和文件大小怎么封包好
发表于: 2013-6-4 10:47 6127

[求助]文件名和文件大小怎么封包好

2013-6-4 10:47
6127
如题,我想通过socket发送文件名和文件大小,以后还有可能是文件属性,最好一次能发过去。

接收端也好拆包,,想咨询一下各位大侠,怎么封装比较好,

我以前的格式,现在居然不能用,也很奇怪。
	
	LPBYTE fileinfo=new BYTE[sizeof(FileSize)+4+FileName.GetLength()];
		int *p=(int *)fileinfo;
		*p=FileSize;p++;
		*p++=FileName.GetLength();
		CopyMemory(p,FileName.GetBuffer(0),FileName.GetLength());     //


求各位大侠给个封包的代码,最好连解包的一起给了。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 268
活跃值: (448)
能力值: ( LV9,RANK:375 )
在线值:
发帖
回帖
粉丝
2
自定义一个结构体吧,里面定义好各个字段的大小,例如:
#pragma pack (1)
typedef struct _FileInfo
{
    char szFileName[256];          // 文件名
    int    nFileSize;                      // 文件大小
    .................................            // 其他属性
}FileInfo, *pFileInfo;
#pragma pack ()
这样你发送的时候,可以直接用一个指针指向,大小用sizeof(FileInfo)即可
2013-6-4 10:55
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=hotsauce;1184442]自定义一个结构体吧,里面定义好各个字段的大小,例如:
#pragma pack (1)
typedef struct _FileInfo
{
    char szFileName[256];          // 文件名
    int    nFileSize;                ...[/QUOTE]

额。直接定义结构体? 那接收端怎么区分呢?难道直接接收进结构体? 但是数据肯定不会自动区分了。
2013-6-4 10:56
0
雪    币: 268
活跃值: (448)
能力值: ( LV9,RANK:375 )
在线值:
发帖
回帖
粉丝
4
双方肯定采用统一定义的数据结构啊,你接收到的数据是应该是什么格式肯定是清楚的,按照格式去解析,并添加相应判断就行了
2013-6-4 11:21
0
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
结构体是个不错的建议
2013-6-4 11:36
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
肯定是直接定义结构体啊。直接发。 不过需要注意一下 内存对齐的问题。
2013-6-4 12:25
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
可是我直接发送,,接收会有问题呀。
2013-6-4 16:04
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
utf8+xml完破任意信息的封包
2013-6-4 16:06
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
我源码发给您看一下吧。
----------------------发送端源码
hFile=CreateFile(FilePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  //打开文件
		int FileSize=GetFileSize(hFile,NULL);       //获取文件大小
		CString FileName="";                        
		FileName=FilePath.Right(FilePath.GetLength()-FilePath.ReverseFind('\\')-1);  //得到文件名
		//lpFile->FileName=FileName.GetBuffer(1);

		strcpy(lpFile->FileName,FileName.GetBuffer(0));
		lpFile->FileSize=FileSize;

		FileName.ReleaseBuffer();
		if(hFile!=INVALID_HANDLE_VALUE)
		{
			CopyMemory(buf,lpFile,sizeof(FileInfo));
			ret=send(CMDSocket,buf,sizeof(FileInfo),0);  //如果打开文件成功,发送文件信息
			delete(lpFile);


----------------------接收端源码
		memset(lpFile,0,sizeof(FileInfo));
		ret=recv(sock,(char *)lpFile,sizeof(FileInfo),0);  //先接收文件名
		if(ret==SOCKET_ERROR)
		{
			OutputDebugString("接收文件名失败");
			return false;
		}
		else
		{
			FileSize=lpFile->FileSize;
			int newopt=2000;
	    	ret=setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char *)&newopt,len);  ///设置接收超时时间
			strcpy(FileName,FileDir);
			strcat(FileName,lpFile->FileName);
			delete(lpFile);
2013-6-4 16:07
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
10
真心不太懂。。。
2013-6-4 16:08
0
雪    币: 268
活跃值: (448)
能力值: ( LV9,RANK:375 )
在线值:
发帖
回帖
粉丝
11
你的lpfile是个结构指针?
另外CreateFile调用后应该立刻检查返回句柄是否有效,不然后面一些用到句柄的函数调用可能会出问题,一般我自己做封包发送的时候,一般是消息头+消息内容,在消息头中会含有消息的长度指示,这样在接收的时候一方面可以判断消息是否接收完整,另一方面碰到粘包的时候也能够正确分离,不知道这么说是否清楚
2013-6-4 21:52
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
12
lpFile是结构指针。。

消息头+消息内容。。可以是可以,不过挺麻烦的。
2013-6-5 10:01
0
游客
登录 | 注册 方可回帖
返回
//