服务端
#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);
}
客户端
#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;
}
#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);
}
客户端
#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;
}
解决方案 »
- 进程的4GB内存空间问题!
- 怎么样实现不让自己的应用程序不在任务管理器的应用程序里不出线。只在进程里出现。
- 在WinCE里面,对话框上的Picture控件里面用pDC->DrawIcon画的CImageList,窗口重绘问题,很急!!!
- 如何得到鼠标在windows窗口中的位置?(不是在某个程序界面中的位置,而是在整个屏幕中的位置)
- 一个线程的问题请大家帮忙解决
- Pocket PC 2002 和 WinCE 3.0 是什么关系?
- CFileDialog图标显示
- camShift.exe 中的 0x009b1b8b 处有未经处理的异常: 0xC0000005: 写入位置 0x009bcfa8 时发生访问冲突
- 谁知道操作系统的环境变量存放在哪儿的呀?怎么样通过程序去得到,或者修改?
- RouterTracer的问题
- 对winspool.drv进行Hook的问题
- MFC的3D场景应用程序如何改写成ActiveX插件?
send(sockCli, fb.pFileBuf, fb.nLen, 0);//再发送二进制文件内容
这两个代码不能保证文件全发出去
两个recv也不能保证全接受TCP/IP不保证一次发送对应一次接受,也不保证一次必然能发送多少字节出去,不是你要发多少字节就多少字节的。报文接收和重组是个必修课,找个例子去学习学习吧不检查、不关心函数返回值是程序员大忌,你怎么知道各个函数执行情况是什么样的?
send(sockCli, fb.pFileBuf, fb.nLen, 0);//再发送二进制文件内容
似乎不太对头吧
我曾在MFC下也写过类似的代码
但是发现如果想将数据长度和数据分两次发送的话,是不能在一个函数内连续的使用send函数的。
你可以把socket的发送功能单独的放在类中,而在需要的时候调用之。
个人意见