socket传输文件的时候,接收了可执行程序如何打不开? 小弟我用二进制文件形式的呀,如何还会有错呢?大家帮小弟我看看
socket传输文件的时候,接收了可执行程序怎么打不开? 我用二进制文件形式的呀,怎么还会有错呢?大家帮我看看。
服务端
客户端
------解决方案--------------------
你的文件多大,客户端调用两次recv就能接受完?
------解决方案--------------------
send(sockCli, szFileLen, 100, 0);//首先发送长度
send(sockCli, fb.pFileBuf, fb.nLen, 0);//再发送二进制文件内容
这两个代码不能保证文件全发出去
两个recv也不能保证全接受
TCP/IP不保证一次发送对应一次接受,也不保证一次必然能发送多少字节出去,不是你要发多少字节就多少字节的。报文接收和重组是个必修课,找个例子去学习学习吧
不检查、不关心函数返回值是程序员大忌,你怎么知道各个函数执行情况是什么样的?
------解决方案--------------------
文件长度为何不直接传二进制数,来回转文本多麻烦还容易出错。
------解决方案--------------------
服务端
- C/C++ code
#include "stdafx.h" #include "MySocket.h" #include <malloc.h> #include <stdlib.h> #include <string.h> typedef struct FILEBUF { char *pFileBuf; long nLen; }; void GetFile(const char* szFileName, FILEBUF* pFileBuf); int _tmain(int argc, _TCHAR* argv[]) { UseSocket(2, 2); SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_port = htons(1987); bind(sockSrv,(SOCKADDR*)&addrSrv, (int)sizeof(SOCKADDR_IN)); listen(sockSrv, 100); SOCKADDR_IN addrCli; int nLen = sizeof(SOCKADDR_IN); while(true) { FILEBUF fb; GetFile("file.exe", &fb); printf("FB = %s \n %d\n",fb.pFileBuf, fb.nLen); SOCKET sockCli = accept(sockSrv, (SOCKADDR*)&addrCli, &nLen); char szFileLen[100]; memset(szFileLen, 0, 100); wsprintfA(szFileLen, "%d", fb.nLen);//将长度存放字符串中 send(sockCli, szFileLen, 100, 0);//首先发送长度 send(sockCli, fb.pFileBuf, fb.nLen, 0);//再发送二进制文件内容 closesocket(sockCli); } return 0; } void GetFile(const char* szFileName, FILEBUF* pFileBuf) { FILE* pFile = NULL; FILE* pFileSave = NULL; long nLen = 0; pFile = fopen(szFileName, "rb"); pFileSave = fopen("FileSave.exe", "wb"); fseek(pFile, 0, SEEK_END);//将文件指针移动到尾 nLen = ftell(pFile);//得到所在位置 fseek(pFile, 0, SEEK_SET);//重新移动回开头 char* pByte = (char*)malloc(nLen); pFileBuf->pFileBuf = (char*)malloc(nLen); pFileBuf->nLen = nLen; fread(pByte, nLen, 1, pFile);//从文件中读取所有二进制内容 strcpy(pFileBuf->pFileBuf, pByte);//将二进制内容复制到结构中 fwrite(pByte, nLen, 1, pFileSave); fclose(pFile); fclose(pFileSave); }
客户端
- C/C++ code
#include "stdafx.h" #include "MySocket.h" #include <stdlib.h> #include <malloc.h> int _tmain(int argc, _TCHAR* argv[]) { UseSocket(2, 2); SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addrSrv.sin_port = htons(1987); connect(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR_IN)); char szFileLen[100]; recv(sockSrv, szFileLen, 100, 0);//先和到文件长度 long nLen = atol(szFileLen); printf("文件长度=%d\n", nLen); char* pFileBuf = (char*)malloc(nLen); memset(pFileBuf, NULL, nLen); recv(sockSrv, pFileBuf, nLen, 0); FILE* pFile = fopen("RecvFile.exe", "wb+"); char* pByte = (char*)malloc(nLen); strcpy(pByte, pFileBuf); fwrite(pByte, nLen, 1, pFile); printf("%s\n", pFileBuf); closesocket(sockSrv); fflush(pFile); fclose(pFile); return 0; }
------解决方案--------------------
你的文件多大,客户端调用两次recv就能接受完?
------解决方案--------------------
send(sockCli, szFileLen, 100, 0);//首先发送长度
send(sockCli, fb.pFileBuf, fb.nLen, 0);//再发送二进制文件内容
这两个代码不能保证文件全发出去
两个recv也不能保证全接受
TCP/IP不保证一次发送对应一次接受,也不保证一次必然能发送多少字节出去,不是你要发多少字节就多少字节的。报文接收和重组是个必修课,找个例子去学习学习吧
不检查、不关心函数返回值是程序员大忌,你怎么知道各个函数执行情况是什么样的?
------解决方案--------------------
文件长度为何不直接传二进制数,来回转文本多麻烦还容易出错。
------解决方案--------------------