首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

socket传输文件的时候,接收了可执行程序如何打不开? 小弟我用二进制文件形式的呀,如何还会有错呢?大家帮小弟我看看

2012-01-24 
socket传输文件的时候,接收了可执行程序怎么打不开? 我用二进制文件形式的呀,怎么还会有错呢?大家帮我看看

socket传输文件的时候,接收了可执行程序怎么打不开? 我用二进制文件形式的呀,怎么还会有错呢?大家帮我看看。
服务端

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不保证一次发送对应一次接受,也不保证一次必然能发送多少字节出去,不是你要发多少字节就多少字节的。报文接收和重组是个必修课,找个例子去学习学习吧

不检查、不关心函数返回值是程序员大忌,你怎么知道各个函数执行情况是什么样的?
[解决办法]
文件长度为何不直接传二进制数,来回转文本多麻烦还容易出错。
------解决方案--------------------


首先检查一下你接收保存的文件是否一样长,另外最好加上校验来保证接收数据的完整性。
[解决办法]
将得到的文件和源文件用工具进行比较,壳用ultraedit
[解决办法]
看看你收到的数据长度是不是等于文件长度的。
[解决办法]
跟后缀有关系么?
[解决办法]
send(sockCli, szFileLen, 100, 0);//首先发送长度
send(sockCli, fb.pFileBuf, fb.nLen, 0);//再发送二进制文件内容
似乎不太对头吧
我曾在MFC下也写过类似的代码
但是发现如果想将数据长度和数据分两次发送的话,是不能在一个函数内连续的使用send函数的。
你可以把socket的发送功能单独的放在类中,而在需要的时候调用之。
个人意见

热点排行