请各位看看: 用 winsock 传送接收文件,接收到的文件数据与原文件不同,不知是何原因.附详细原码.

lner 2002-05-31 10:39:56
/////////////////////////////////////////
服务端: (接收文件)

#include "stdafx.h"

BOOL g_bWorking;

CListBox* g_log = NULL;
const UINT nPacketSize = 1024*4 ;

UINT ServiceThreadProc(LPVOID pParam)
{
SOCKET clientsocket = (SOCKET) pParam;
BOOL bOk = FALSE;
char filenamelen[4]; // int
char filelength[32]; // dword

recv(clientsocket, filenamelen, 4, 0); // receive filename length
char* filename = (char*)malloc(atoi(filenamelen));


recv(clientsocket, filename, atoi(filenamelen), 0); // receive filename

recv(clientsocket, filelength, 32, 0); // receive file length

int nLen = atoi(filelength);


byte* data;



HANDLE hFile = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING, NULL);

if (hFile == INVALID_HANDLE_VALUE)
bOk = FALSE;
else
bOk = TRUE;

DWORD writeSize;
if (bOk) {
while (nLen > 0) {

if (nLen >= nPacketSize) {
data = new byte[nPacketSize];

if( recv(clientsocket, (char*)data, nPacketSize, 0) == SOCKET_ERROR)
AfxMessageBox("socket error");

WriteFile(hFile, data, nPacketSize, &writeSize, NULL);
nLen -= nPacketSize;
}
else {
data = new byte[nLen];

if (recv(clientsocket, (char*)data, nLen, 0) == SOCKET_ERROR)
AfxMessageBox("socket error");

WriteFile(hFile, data, nLen, &writeSize, NULL);
nLen = 0;
}
} // End while

FlushFileBuffers(hFile);
CloseHandle(hFile);
}
else {
AfxMessageBox("open file fail");
}


AfxMessageBox("receive complete");

closesocket(clientsocket);
free(filename);

return 0;
};

UINT ServerThreadProc(LPVOID pParam)
{
//初始化TCP协议
SOCKET serversocket;
WSADATA wsaData ;
BOOL ret = WSAStartup(MAKEWORD(1,1), &wsaData);
if (ret != 0) {
AfxMessageBox("初始化套接字失败!");
return 1;
}

//创建服务器端套接字
serversocket = socket(AF_INET, SOCK_STREAM, 0); //IPPROTO_TCP
if (serversocket == INVALID_SOCKET) {
AfxMessageBox("创建套接字失败!");
closesocket(serversocket);
WSACleanup();
return 2;
}

//绑定到本地一个端口上
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(1234);
localaddr.sin_addr.s_addr = INADDR_ANY; // OR
//localaddr.sin_addr.s_addr = inet_addr("192.168.0.1") ;

if (bind(serversocket, (const struct sockaddr*) & localaddr,
sizeof(localaddr)) == SOCKET_ERROR)
{
AfxMessageBox("绑定地址失败!");
closesocket(serversocket);
WSACleanup();
return 3;
}

listen(serversocket, 5); //设置侦听模式

g_bWorking = TRUE;
int len = sizeof(sockaddr);
sockaddr_in clientaddr;




while (g_bWorking) {
SOCKET client = accept(serversocket, (struct sockaddr*)&clientaddr, &len);
AfxBeginThread(ServiceThreadProc, (LPVOID)client, THREAD_PRIORITY_NORMAL);
}

return 0;
};

//////////////////////////////////////////////////////////////////

客户端:(发送文件)

void CTcpClientDlg::OnbuttonConnect()
{

int result ;
WSADATA wsaData ;

//初始化TCP协议
BOOL ret = WSAStartup(MAKEWORD(1,1), &wsaData);
if (ret != 0) {
MessageBox("初始化套接字失败!");
return ;
}

//创建客户端套接字
m_clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_clientSocket == INVALID_SOCKET) {
MessageBox("创建套接字失败!");
closesocket(m_clientSocket);
WSACleanup();
return ;
}

struct sockaddr_in destaddr ;
destaddr.sin_family = AF_INET;
destaddr.sin_port = htons(1234);
destaddr.sin_addr.s_addr = inet_addr("192.168.0.1");

result = connect(m_clientSocket, (struct sockaddr *) & destaddr,sizeof(destaddr)) ;

if (result == SOCKET_ERROR) {
MessageBox("connect error");
return ;
}

//socket注册异步事件,注意没有Accept事件
if (WSAAsyncSelect(m_clientSocket ,m_hWnd, NETWORK_EVENT,
FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)
{
MessageBox("(client)注册异步事件失败!");
return;
}

m_IsConnected = true ;

/////////////////////////////////////
char filenamelen[4];
char filelength[8];
char* filename = "lostinspace.mov";
CFile readFile;

CString echo;
const nPacketSize = 1024*4;

_itoa(strlen(filename), filenamelen, 10);
send(m_clientSocket, filenamelen, 4, 0); // send filename length
send(m_clientSocket, filename, strlen(filename), 0); // send filename


readFile.Open("E:\\lostinspace.mov", CFile::modeRead);
DWORD filelen = readFile.GetLength() ;
readFile.Close();

HANDLE hFile = CreateFile("E:\\lostinspace.mov", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL);

//if (readFile.Open("E:\\lostinspace.mov", CFile::modeRead))
if (hFile != INVALID_HANDLE_VALUE) {

_itoa(filelen, filelength, 10);

send(m_clientSocket, filelength, 32, 0); // send file length
byte* data = NULL;
DWORD dwReaded;

while (filelen > 0) {

if (filelen >= nPacketSize) {
data = new byte[nPacketSize];
ReadFile(hFile, data, nPacketSize, &dwReaded, NULL);
send(m_clientSocket, (char*)data, nPacketSize, 0);
filelen = filelen - nPacketSize;
}
else {
data = new byte[filelen];
ReadFile(hFile, data, filelen, &dwReaded, NULL);
send(m_clientSocket, (char*)data, filelen, 0);
filelen = 0;
}
}

CloseHandle(hFile);
MessageBox("send complete.");

}
else {
MessageBox("Open file fail");
}

}

/////////////////////////////////////////////////
...全文
109 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlb2000 2002-05-31
  • 打赏
  • 举报
回复
要在接收数据和将数据写入文件之间设立缓冲区(如设一个数组),在数据全部接受完毕时,再将缓冲区的数据写入文件。不然的话,接收数据和写入文件常常不同步,如后者时间比前者长,赵成先到的数据被后来的数据覆盖而丢失数据
qiuanhong 2002-05-31
  • 打赏
  • 举报
回复

发过来,晚上跟你调试一下
dnetmaterial@sohu.com
wxfjb 2002-05-31
  • 打赏
  • 举报
回复
缩进不好,所以没有读你的代码。不过我用的是字符数组传送的。没有问题,在OnReceive()中调用接收函数并写入文件。
不过你似乎没有传送文件本身的信息。
SOCKET_STREAM_FILE_INFO StreamFileInfo;
WIN32_FIND_DATA FindFileData;

FindClose(FindFirstFile(Dlg.GetPathName(),&FindFileData));
memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));
strcpy(StreamFileInfo.szFileTitle,myFile.GetFileTitle());

StreamFileInfo.dwFileAttributes = FindFileData.dwFileAttributes;
StreamFileInfo.ftCreationTime = FindFileData.ftCreationTime;
StreamFileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;
StreamFileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;
StreamFileInfo.nFileSizeHigh = FindFileData.nFileSizeHigh;
StreamFileInfo.nFileSizeLow = FindFileData.nFileSizeLow;
xuying 2002-05-31
  • 打赏
  • 举报
回复
出什么错啊,说一下。
检查你的文件名,文件长度是否传送的正确。
lner 2002-05-31
  • 打赏
  • 举报
回复
另: 发送端发送时能连继发送数据,服务器常常是接收到一半就停顿了,当发送端发完,退出程序时,服务器再继续接收数据,不知什么原因
lner 2002-05-31
  • 打赏
  • 举报
回复
谢谢楼上的建议,如需源程序调试(谢谢你的帮助),请留下 email ,在线发送.
大气污染是影响公众健康与生态环境的重要问题,精准的空气质量时空预测与污染源贡献度量化是精准治污的关键支撑。针对现有研究多源融合不充分、时空关联刻画不足、预测与源解析割裂三方面缺陷,本文设计实现了城市空气质量时空预测与污染源贡献度分析系统,融合监测、气象、工业排放与交通四类数据,构建基于时空注意力的LSTM(STAM-LSTM)预测模型与基于正定矩阵因子分解(PMF)的源解析模型,形成数据融合-特征工程-预测-源解析-可视化闭环。 系统实现四类数据时空对齐与融合,构建时序与空间邻域特征,以普通克里金插值生成1km网格浓度场;STAM-LSTM引入时空注意力自适应学习站点间污染传输时变权重,以72小时输入预测未来24小时逐小时PM2.5浓度;PMF识别交通、工业、燃煤、扬尘与二次生成五个源因子,量化各源全年贡献度并分析时空演变。 实验表明:STAM-LSTM预测RMSE 24.6、MAE 17.8、R² 0.88,相对LSTM基线(30.2)提升18.5%;普通克里金插值误差8.9,优于反距离加权(11.4);源解析显示交通源28.4%、工业源23.1%、燃煤源19.6%为主要贡献源,冬季燃煤源升至27.3%、早高峰交通源达34.8%,下风向工业源贡献高出上风向8~12个百分点;减排情景显示交通源减排20%可使年均PM2.5下降5.7%,与源贡献度排序一致。 系统按五模块14组件实现,功能测试16项用例全部通过,为大气污染预警、源管控与减排政策制定提供了决策依据。 【课程报告内容】 摘要 第1章 绪论 第2章 相关技术与理论 第3章 系统需求分析 第4章 系统总体设计 第5章 系统详细设计与实现 第6章 系统测试与分析 第7章 总结与展望 参考文献 件-实现指南
基于iTransformer-BiGRU-KAN多模型融合的滚动轴承剩余寿命预测研究(Python代码实现)内容概要:本文提出了一种基于iTransformer-BiGRU-KAN多模型融合的滚动轴承剩余寿命预测方法,旨在通过结合多种先进深度学习模型的优势,提升在复杂工况下的预测精度与鲁棒性。该方法利用iTransformer捕捉长期时间序列中的全局依赖关系,通过BiGRU模型提取双向时序特征,最后引入KAN(Kernel Attention Network)增强非线性映射与关键特征的自适应加权能力,实现对轴承退化过程的精准建模。文中详细介绍了模型架构设计、训练流程及在公开数据集上的实验验证,结果表明该融合模型相比单一模型在预测精度和稳定性方面均有显著提升。; 适合人群:具备一定机器学习与深度学习基础,从事设备故障诊断、工业大数据分析或智能运维相关领域的研究人员及工程技术人员,尤其适合研究生及以上学历或有相关项目经验的专业人员。; 使用场景及目标:①应用于工业设备状态监测与预测性维护系统中,实现对滚动轴承等关键部件剩余寿命的精准预测;②为复杂时间序列回归任务提供多模型融合的设计思路与技术参考;③推动深度学习在智能制造与工业物联网领域的落地应用。; 阅读建议:建议读者结合Python代码实现部分,深入理解各子模型的接口设计与融合逻辑,重点关注特征融合机制与注意力权重的可视化分析,以便在实际项目中灵活调整与优化模型结构。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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