TCP通信接收数据不完整的解决方法

King_LJames 2019-06-21 12:41:59
用TCP写了一个下载功能,出现了文本文件下载了0kb,大点的exe文件丢掉了一部分导致无法运行。。。

服务端
DWORD WINAPI CreateClientThread(LPVOID lpParameter)//在这个函数完成收到一个文件路径并发送文件
{
SOCKET socketServer = (SOCKET)lpParameter;
char buf_msg[BUFSIZ];
int ret = 0;
int sresult = 0;
FileHelper fh;
do
{
memset(buf_msg, 0, BUFSIZ);
ret = recv(socketServer, buf_msg, BUFSIZ, 0);//收到文件名
if (ret > 0)
{
if (strcmp(buf_msg, "exit") == 0)
{
cout << "用户请求关闭连接" << endl;
break;
}
cout << buf_msg << endl;
char recName[BUFSIZ];
strcpy(recName, buf_msg);
FILE *f = fh.selectfile(recName);//此时path_buffer得到了完整路径E:\1.pdf,并且f指到了这个文件
char *name = fh.getFileName();//name得到的是文件及后缀名1.pdf
char sendName[BUFSIZ];
strcpy(sendName, name);
send(socketServer, sendName, BUFSIZ, 0);//发送的是1.pdf
f = fopen(recName, "rb"); //以二进制方式打开文件
if (f == NULL)
{
cout << "不能打开文件" << endl;
fclose(f);
system("pause");
exit(0);
}
else
{
//开始传输文件
//循环发送数据,直到文件结尾
int nCount;
//long long sum = 0;
while ((nCount = fread(sendName, 1, BUFSIZ, f)) > 0)
{
//cout<<(sum+=nCount)<<endl;//输出的是当前发送的字节数
send(socketServer, sendName, nCount, 0);
}

}
}
else if (ret == 0)
{
cout << "连接已关闭..." << endl;
}
else
{
cerr << "收到客户端信息失败" << ::GetLastError() << "\n";
closesocket(socketServer);
system("pause");
return 1;

}


} while (ret > 0);
ret = shutdown(socketServer, SD_SEND);
if (ret == SOCKET_ERROR)
{
cerr << "无法关闭套接字 " << ::GetLastError() << "\n";
closesocket(socketServer);
system("pause");
return 1;
}
//delete &fh;//回收内存
//fh = NULL;
return 0;
}


客户端
void Client::ConnectToServer()
{
//开始连接
FileHelper fh;
int fail = connect(socketClient, (SOCKADDR*)&addrClient, len);
if (fail)
{
cout << "与服务端连接失败!程序将退出..." << endl;
system("pause");
exit(1);
}
cout << "请输入你想要传输的文件名:";
cin >> Filename;
//发送地址给服务端
send(socketClient, Filename, BUFSIZ, 0);

//接受服务端的文件名:1.txt
char revName[BUFSIZ];
recv(socketClient, revName, BUFSIZ, 0);
char fromname[BUFSIZ] = {};
strcpy(fromname, revName);//fromname :1.txt

char* dirName = GetDirName(); //要开始选择一个地方建一个文件夹,然后开始传输内容
fh.createDir(dirName);
//cout<<"文件夹创建成功!";
//在dirName目录下创建一个和服务器里面一模一样的文件
char mid[3] = "\\";
char finame[MAX_PATH] = {};
strcat(finame, dirName);
strcat(finame, mid);
strcat(finame, fromname);
FILE *f = fh.createFile(finame);

//开始传输文件
char buffer[BUFSIZ] = "";//文件缓冲区
int nCount;
while ((nCount = recv(socketClient, buffer, BUFSIZ, 0)) > 0)
{
fwrite(buffer, nCount, 1, f);
}
//Thread.Sleep(10);
//cout<<fromname<<""<<endl;
fclose(f);
}


意外输出截图
...全文
1070 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
begar 2019-09-11
  • 打赏
  • 举报
回复
文件格式,一个是二进制打开的,写是什么格式呢,看不到
begar 2019-09-11
  • 打赏
  • 举报
回复
问题不少,recName变量没有初始化,send没有判断返回值
begar 2019-09-11
  • 打赏
  • 举报
回复
怀疑是fwrite函数的问题,一般严谨的做法是判断fwrite的返回值,部分成功的话要把没有写成功的重新fwrite一下
King_LJames 2019-06-21
  • 打赏
  • 举报
回复
顶一下,希望有大佬能解决

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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