UDP发送位图,为什么只有最后的一百个字节正确?
VC6,UDP传送
我做了一个24色的bmp位图(很小,上面写了12两个字符),占用1134字节,我在本机测试:
用CFile把位图读到char[2048]里(为了保证读入正确,读完后把char[2048]缓冲换个文件名重写到硬盘,图片写入正确)。
用SOCKET的UDP方式把缓冲区发送到接收方(实际都是127.0.0.1的8000端口),接收后把接收缓冲区写入文件,结果图片除了大小对外,不能预览,用二进制查看器与原文件比较,发现只是最后末尾的100个字节对,前面全是00000000(一千多个0),
以为是网络问题,所以换成一1134个长的字符串发送,结果用二进制查看器查看(以字符方式)收到的文件,发现完全正确。
以下是相关的几段代码:
结果就如开始说的那样,只有最后一百个了节对,前面全是0000;
我专门在发送时指定了一个一千多字节的"1234567890ABVDEF12343....",结果收到正确。
请高人指点一下为什么会这样?(不用说拆包发送,只需要一次发送很小的位图)
我做了一个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....",结果收到正确。
请高人指点一下为什么会这样?(不用说拆包发送,只需要一次发送很小的位图)
...全文
相关推荐
Socket UDP 发送结构体数据
解析接收到的数据时,需要确保正确地将字节流还原为结构体。这个过程与发送端相反,使用`ntohl()`和`ntohs()`将网络字节序转换回主机字节序。
屏幕捕获与UDP传输控件实现
本文还有配套的精品资源,点击获取 简介:该软件控件实现屏幕捕获功能,并通过UDP协议实现图像的网络传输。它支持不同的颜色深度,允许用户在不同设备间实时共享屏幕内容。控件易于集成,适用于快速构建远程控制或监控应用程序。提供多种资源文件和源代码,以供在Delphi或类似环境中使用。 1. 屏幕捕获功能实现 1.1 屏幕捕获基础概念 屏幕捕获是指使用软件技术...
java UDP报文的发送与接收
**发送数据**:最后,通过`DatagramSocket`的`send()`方法发送封装好的`DatagramPacket`。 ```java socket.send(packet); ```5.
python UDP(udp)协议发送和接收的实例
- `sendto()` 方法用于向指定的目标地址发送数据。参数为一个元组,包含两个元素:要发送的消息(已编码为字节串)以及目标地址(IP地址和端口号组成的元组)。##### 2.
基于raw socket的UDP数据的发送和接收
最后,将数据附加到头部后面,一并发送出去。在接收端,同样需要创建并绑定Raw Socket,然后使用`recvfrom()`函数接收数据。


网络编程
