谁能帮我看看这个VC文件传输程序的错误啊
下面是我在网上抄的一个VC文件传输程序,没错误,但是运行的时候显示的是发送成功,但是接收是失败。哪位好心人能直接拷过去,帮我看看是哪里有问题啊。
发送和接受程序是在一个程序里。
#pragma comment(lib, "ws2_32.lib")
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <assert.h>
#include <iostream>
using namespace std;
#define CHARLENGTH 80 //字符串长//
#define SEND_BUFFER_SIZE 4096 //发送缓冲区//
#define RECV_BUFFER_SIZE 4096 //接收缓冲区//
#define PORT 8508 //默认端口//
#define TRUE 1
#define FALSE 0
enum {CMD_NAME};
int RecvFile(); //接收
int SendFile(); //发送
int usage(char msg[]); //帮助提示
int main(int argc, char *argv[])
{
char operate[CHARLENGTH];
memset(operate, '\0', sizeof(operate));
usage(argv[CMD_NAME]);
while (printf("\n\n") && printf("请输入参数 : ") && scanf("\n%s", operate) != EOF)
{
if (strlen(operate) > 2 )
{
usage(argv[CMD_NAME]);
continue;
}
switch (operate[1])
{
case 'r': RecvFile();
break;
case 's': SendFile();
break;
case 'q': printf("谢谢使用 [%s]\nByeBye!\n\n", argv[CMD_NAME]);
return(0);
break;
default : usage(argv[CMD_NAME]);
break;
}
}
return(0);
}
int RecvFile()
{
char filePath[CHARLENGTH];
printf("请输入保存文件的绝对路径 :\n"); //获取文件保存路径//
memset(&filePath, '\0', sizeof(filePath));
scanf("\n%s", filePath);
WSADATA wsaData;
WSAStartup(WINSOCK_VERSION, &wsaData);
//建立连接//
SOCKET sockrecv = socket(AF_INET, SOCK_STREAM, 0); //创建套接字//
if (sockrecv < 0)
{
closesocket(sockrecv);
WSACleanup();
perror("sock");
printf("警告: 创建套接字失败!\n");
return(FALSE);
}
SOCKADDR_IN addrSrv;
memset(&addrSrv, '\0', sizeof(addrSrv));
addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //填充本地ip//
addrSrv.sin_port = htons(PORT); //填充默认端口//
int ret1 = bind(sockrecv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR)); //绑定套接字//
if (ret1 < 0)
{
closesocket(sockrecv);
WSACleanup();
perror("bind");
printf("警告: 绑定失败!\n");
return(FALSE);
}
printf("等待连接......");
int ret2 = listen(sockrecv, 5); //开始监听,限制5个连接//
if (ret2 < 0)
{
closesocket(sockrecv);
WSACleanup();
perror("listen");
printf("警告: 监听失败!\n");
return(FALSE);
}
SOCKADDR_IN addrCli;
memset(&addrCli, '\0', sizeof(addrCli));
int len = sizeof(SOCKADDR);
SOCKET sockCli = accept(sockrecv, (SOCKADDR*)&addrCli, &len); //开始接收//
if(sockCli < 0)
{
closesocket(sockrecv);
WSACleanup();
perror("accept");
printf("警告: 接收失败!\n");
return(FALSE);
}
printf("已经连接 %s\n", inet_ntoa(addrCli.sin_addr)); //显示连接端信息//
int fileLength, cbBytesRet, cbLeftToRecv;
BYTE* recvData = NULL;
//创建文件//
HANDLE hFile;
hFile = CreateFile( (LPCWSTR)filePath, //string 文件名或者绝对路径
GENERIC_WRITE, //long 读写权限,如果为零,表示只允许获取与一个设备有关的信息
FILE_SHARE_WRITE, //long 零表示不共享,FILE_SHARE_READ 或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
NULL, //指向SECURITY_ATTRIBUTES结构的指针,判定返回的句柄是否可以被子进程继承,定义了文件的安全特性,用null表示不被继承。
OPEN_ALWAYS, //long 创建文件,如文件存在则会出错
0, //long 文件默认属性
NULL); //long 如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性
assert(hFile && "CreateFile!");
/*
FILE* hFile;
hFile = fopen(filePath, "wb");
*/
printf("正在接收文件......\n");
//首先接收文件长度信息//
cbLeftToRecv = sizeof(fileLength);
do
{
BYTE* bp = (BYTE*)(&fileLength) + sizeof(fileLength) - cbLeftToRecv;
cbBytesRet = recv(sockCli, (char*)bp, cbLeftToRecv, 0);
if (cbBytesRet < 0 || cbBytesRet == 0 )
{
perror("recv");
printf("警告: 接收文件长度失败!\n");
delete recvData;
CloseHandle(hFile);
closesocket(sockrecv);
WSACleanup();
}
cbLeftToRecv -= cbBytesRet;
}
while (cbLeftToRecv > 0);
fileLength = htonl(fileLength); //将文件的长度信息转化为本地字节序//
//开始接收文件
recvData = new BYTE[RECV_BUFFER_SIZE];
cbLeftToRecv = fileLength;
do
{
int iiGet, iiRecv;
iiGet = (cbLeftToRecv < RECV_BUFFER_SIZE) ? cbLeftToRecv : RECV_BUFFER_SIZE;
iiRecv = recv(sockCli, (char*)recvData, iiGet, 0); //流型数据的接收处理//
printf("cbLeftToRecv %d iiGet %d iiRecv %d sizeof(recvData) %d\n", cbLeftToRecv, iiGet, iiRecv, sizeof(recvData));
if (iiRecv < 0 || iiRecv == 0)
{
perror("recv");
printf("警告: 接收文件失败!\n");
goto PreReturn;
}
DWORD dwLen;
int ret3 = WriteFile(hFile, //Long,一个文件的句柄
recvData, //Any,要写入的一个数据缓冲区
iiRecv, //Long,要写入数据的字节数量。如写入零字节,表示什么都不写入,针对位于远程系统的命名管道,限制在65535个字节以内
&dwLen, //Long,实际写入文件的字节数量
NULL); //OVERLAPPED,倘若在指定FILE_FLAG_OVERLAPPED的前提下打开文件,这个参数就必须引用一个特殊的结构。
//那个结构定义了一次异步写操作。否则,该参数应置为空(将声明变为ByVal As Long,并传递零值)
/*
int ret3 = fwrite(recvData, RECV_BUFFER_SIZE, 1, hFile);
if (ret3 == 0) printf("警告: 文件写入出错!\n");
*/
//cbLeftToRecv -= iiRecv;
}
while (cbLeftToRecv > 0);
// fclose(hFile);
// hFile = fopen(filePath, "rb");
// if (hFile !=NULL)
//{ //取得文件大小//
// fseek(hFile, 0L, SEEK_END);
// fileLength = ftell(hFile);
// fseek(hFile, 0L, SEEK_SET);
// }
// fileLength = GetFileSize(hFile, NULL);
// printf("test: 文件长度 %d\n", fileLength);
printf("接收完成.\n");
//接收结束,释放内存,关闭连接//
PreReturn:
delete recvData;
CloseHandle(hFile);
closesocket(sockrecv);
WSACleanup();
return(0);
}