UDP发送位图,为什么只有最后的一百个字节正确?

wmnmtm wmnmtm 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
VC6,UDP传送

我做了一个24色的bmp位图(很小,上面写了12两个字符),占用1134字节,我在本机测试:

用CFile把位图读到char[2048]里(为了保证读入正确,读完后把char[2048]缓冲换个文件名重写到硬盘,图片写入正确)。

用SOCKET的UDP方式把缓冲区发送到接收方(实际都是127.0.0.1的8000端口),接收后把接收缓冲区写入文件,结果图片除了大小对外,不能预览,用二进制查看器与原文件比较,发现只是最后末尾的100个字节对,前面全是00000000(一千多个0),

以为是网络问题,所以换成一1134个长的字符串发送,结果用二进制查看器查看(以字符方式)收到的文件,发现完全正确。


以下是相关的几段代码:


CFile file;
if(!file.Open(m_strPathName, CFile::modeRead | CFile::typeBinary))
{
AfxMessageBox("打开文件失败");
return ;
}


//假设一次读完,当然大文件得循环读,此处只为测试
ilen = file.Read(bufx, 1134);//ilen = file.Read((void*)bufx, 1134);


void CTest2Dlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
WORD wVersionRequested;
WSADATA wsadata;

wVersionRequested = MAKEWORD(2,2);

int nErrCode;
nErrCode = WSAStartup(MAKEWORD(2,2),&wsadata);

if (0 != nErrCode)
{
//没有找到可用的套接字
AfxMessageBox("没有找到可用的DLL");
}

SOCKET socket1;
socket1 = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN sockaddr_in1;
ZeroMemory(bufx,1024);
sockaddr_in1.sin_addr.s_addr=inet_addr("127.0.0.1");
sockaddr_in1.sin_family=AF_INET;
sockaddr_in1.sin_port=htons((short)8000);

long iLength;
iLength = sendto(socket1,bufx,1134,0,(SOCKADDR*)&sockaddr_in1,sizeof(sockaddr_in1));
}


下面是接收的代码:


void CServerDlg::OnBtnRecv()
{
// TODO: Add your control notification handler code here
SOCKADDR_IN sockaddr_in1;
SOCKET socket1;
// char buf[2048];
int nClientLen;

WORD wVersionRequested;
WSADATA wsadata;

wVersionRequested = MAKEWORD(2,2);

int nErrCode;
nErrCode = WSAStartup(MAKEWORD(2,2),&wsadata);

if (0 != nErrCode)
{
//没有找到可用的套接字
//MessageBox(NULL,"没有找到可用的DLL","初始化失败",MB_OK);
}


sockaddr_in1.sin_addr.s_addr=htonl(INADDR_ANY);
sockaddr_in1.sin_family=AF_INET;
sockaddr_in1.sin_port=htons((short)8000);

nClientLen = sizeof(sockaddr_in1);

socket1 = socket(AF_INET,SOCK_DGRAM,0);

bind(socket1,(SOCKADDR*)&sockaddr_in1,nClientLen);
memset(buf,0,sizeof(buf));

iLengthRecv = recvfrom(socket1,buf,sizeof(buf),0,(SOCKADDR*)&sockaddr_in1,&nClientLen);

CString m_strFilePath;
m_strFilePath="c:\\123.jpg";
UINT rcv;
//接受并保存文件。
CFile file(m_strFilePath, CFile::modeCreate | CFile::modeWrite);

file.Write(buf, iLengthRecv);//把接收缓冲区原封不动的存为文件

file.Close();

}

结果就如开始说的那样,只有最后一百个了节对,前面全是0000;

我专门在发送时指定了一个一千多字节的"1234567890ABVDEF12343....",结果收到正确。

请高人指点一下为什么会这样?(不用说拆包发送,只需要一次发送很小的位图)

...全文

相关推荐

评论 13
收藏 已收藏
分享
返回顶部
wmnmtm
网络编程 18,356 成员 64,161 内容