C++ Winsock将文件上载到远程服务器
我试图上传文件到服务器,但他们总是来破坏,该程序非常简单,只用于传输客户端和服务器之间的文件。 我需要这段代码的帮助,以解决问题。 并加以改进 服务器C++ Winsock将文件上载到远程服务器,c++,winsock,C++,Winsock,我试图上传文件到服务器,但他们总是来破坏,该程序非常简单,只用于传输客户端和服务器之间的文件。 我需要这段代码的帮助,以解决问题。 并加以改进 服务器 int Socket_Manip::FILE_UPLOAD() { //get file size. iResult = recv(ClientSocket, GotFileSize, LENGTH, 0); if (iResult == 0) { closesocket(ClientSo
int Socket_Manip::FILE_UPLOAD() {
//get file size.
iResult = recv(ClientSocket, GotFileSize, LENGTH, 0);
if (iResult == 0)
{
closesocket(ClientSocket);
WSACleanup();
return 1;
}
else if (iResult < 0) {
closesocket(ClientSocket);
WSACleanup();
return 1;
}
//start manip download
long FileSize = atoi(GotFileSize);
long SizeCheck = 0;
char* mfcc;
FILE *fp = fopen("C::\\Users\\Server\\Downloads\\transfer.zip", "wb");
if (fp == NULL)
{
closesocket(ClientSocket);
WSACleanup();
return 1;
}
if (FileSize > 1499) {
mfcc = (char*)malloc(1500);
while (FileSize > SizeCheck){
int Received = recv(ClientSocket, mfcc, 1500, 0);
if (Received == 0)
{
break;
}
else if (Received < 0) {
closesocket(ClientSocket);
WSACleanup();
return 1;
}
SizeCheck += Received;
fwrite(mfcc, 1, Received, fp);
fflush(fp);
}
} else
{
mfcc = (char*)malloc(FileSize + 1);
int Received = recv(ClientSocket, mfcc, FileSize, 0);
fwrite(mfcc, 1, Received, fp);
fflush(fp);
}
fclose(fp);
free(mfcc);
}
int File_Transfer_Manip() {
FILE *File;
char *Buffer;
unsigned long Size;
File = fopen("C:\\Users\\r4minux\\Downloads\\upload.zip", "rb");
if (!File)
{
printf("Error file\n");
return 1;
}
fseek(File, 0, SEEK_END);
Size = ftell(File);
fseek(File, 0, SEEK_SET);
Buffer = new char[Size];
fread(Buffer, Size, 1, File);
char cSize[MAX_PATH];
sprintf(cSize, "%i", Size);
fclose(File);
iResult = send(ConnectSocket, cSize, MAX_PATH, 0); // File size
if (iResult == SOCKET_ERROR) {
printf("send erroR: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
getchar();
return 1;
}
int Offset = 0;
while (Offset < Size)
{
int Amount = send(ConnectSocket, Buffer + Offset, Size - Offset, 0);
if (Amount <= 0)
{
std::cout << "Error: " << WSAGetLastError() << std::endl;
break;
}
else
{
Offset += Amount;
}
}
// cleanup
free(Buffer);
}
intsocket\u Manip::FILE\u UPLOAD(){
//获取文件大小。
iResult=recv(ClientSocket,GotFileSize,长度,0);
如果(iResult==0)
{
闭合插座(ClientSocket);
WSACleanup();
返回1;
}
否则如果(iResult<0){
闭合插座(ClientSocket);
WSACleanup();
返回1;
}
//启动manip下载
long FileSize=atoi(GotFileSize);
长SizeCheck=0;
char*mfcc;
文件*fp=fopen(“C::\\Users\\Server\\Downloads\\transfer.zip”,“wb”);
如果(fp==NULL)
{
闭合插座(ClientSocket);
WSACleanup();
返回1;
}
如果(文件大小>1499){
mfcc=(char*)malloc(1500);
而(文件大小>大小检查){
接收到的int=recv(ClientSocket,mfcc,1500,0);
如果(接收==0)
{
打破
}
否则,如果(接收<0){
闭合插座(ClientSocket);
WSACleanup();
返回1;
}
SizeCheck+=已接收;
fwrite(mfcc,1,接收,fp);
fflush(fp);
}
}否则
{
mfcc=(char*)malloc(FileSize+1);
int Received=recv(ClientSocket,mfcc,FileSize,0);
fwrite(mfcc,1,接收,fp);
fflush(fp);
}
fclose(fp);
免费(mfcc);
}
客户端发件人
int Socket_Manip::FILE_UPLOAD() {
//get file size.
iResult = recv(ClientSocket, GotFileSize, LENGTH, 0);
if (iResult == 0)
{
closesocket(ClientSocket);
WSACleanup();
return 1;
}
else if (iResult < 0) {
closesocket(ClientSocket);
WSACleanup();
return 1;
}
//start manip download
long FileSize = atoi(GotFileSize);
long SizeCheck = 0;
char* mfcc;
FILE *fp = fopen("C::\\Users\\Server\\Downloads\\transfer.zip", "wb");
if (fp == NULL)
{
closesocket(ClientSocket);
WSACleanup();
return 1;
}
if (FileSize > 1499) {
mfcc = (char*)malloc(1500);
while (FileSize > SizeCheck){
int Received = recv(ClientSocket, mfcc, 1500, 0);
if (Received == 0)
{
break;
}
else if (Received < 0) {
closesocket(ClientSocket);
WSACleanup();
return 1;
}
SizeCheck += Received;
fwrite(mfcc, 1, Received, fp);
fflush(fp);
}
} else
{
mfcc = (char*)malloc(FileSize + 1);
int Received = recv(ClientSocket, mfcc, FileSize, 0);
fwrite(mfcc, 1, Received, fp);
fflush(fp);
}
fclose(fp);
free(mfcc);
}
int File_Transfer_Manip() {
FILE *File;
char *Buffer;
unsigned long Size;
File = fopen("C:\\Users\\r4minux\\Downloads\\upload.zip", "rb");
if (!File)
{
printf("Error file\n");
return 1;
}
fseek(File, 0, SEEK_END);
Size = ftell(File);
fseek(File, 0, SEEK_SET);
Buffer = new char[Size];
fread(Buffer, Size, 1, File);
char cSize[MAX_PATH];
sprintf(cSize, "%i", Size);
fclose(File);
iResult = send(ConnectSocket, cSize, MAX_PATH, 0); // File size
if (iResult == SOCKET_ERROR) {
printf("send erroR: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
getchar();
return 1;
}
int Offset = 0;
while (Offset < Size)
{
int Amount = send(ConnectSocket, Buffer + Offset, Size - Offset, 0);
if (Amount <= 0)
{
std::cout << "Error: " << WSAGetLastError() << std::endl;
break;
}
else
{
Offset += Amount;
}
}
// cleanup
free(Buffer);
}
int File\u Transfer\u Manip(){
文件*文件;
字符*缓冲区;
无符号长尺寸;
File=fopen(“C:\\Users\\r4minux\\Downloads\\upload.zip”,“rb”);
如果(!文件)
{
printf(“错误文件\n”);
返回1;
}
fseek(文件,0,SEEK_END);
大小=ftell(文件);
fseek(文件,0,搜索集);
缓冲区=新字符[大小];
fread(缓冲区,大小,1,文件);
char cSize[最大路径];
sprintf(cSize,“%i”,大小);
fclose(文件);
iResult=send(ConnectSocket,cSize,MAX_PATH,0);//文件大小
if(iResult==SOCKET\u错误){
printf(“发送错误:%d\n”,WSAGetLastError());
闭合插座(连接插座);
WSACleanup();
getchar();
返回1;
}
整数偏移=0;
while(偏移量<大小)
{
int Amount=send(ConnectSocket,缓冲区+偏移量,大小-偏移量,0);
如果(AmountTCP是一个字节流。它没有消息边界的概念。你不能确保send()
实际上发送了你给它的所有内容,或者recv()
正在读取你要求它读取的所有内容。它们可以返回更少的字节。你必须对此做出解释
请尝试以下方法:
服务器:
int readBytes(SOCKET s, void *buffer, int buflen)
{
int total = 0;
unsigned char *pbuf = (unsigned char*) buffer;
while (buflen > 0)
{
int iResult = recv(s, pbuf, buflen, 0);
if (iResult < 0)
{
if (WSAGetLastError() == WSAEWOULDBLOCK)
{
// optionally use select() to wait for the
// socket to have more bytes to read before
// calling recv() again...
continue;
}
printf("recv error: %d\n", WSAGetLastError());
return SOCKET_ERROR;
}
else if (iResult == 0)
{
printf("disconnected\n");
return 0;
}
else
{
pbuf += iResult;
buflen -= iResult;
total += iResult;
}
}
return total;
}
int Socket_Manip::FILE_UPLOAD()
{
//start download
FILE *fp = fopen("C::\\Users\\Server\\Downloads\\transfer.zip", "wb");
if (fp == NULL)
{
printf("Error creating file\n");
closesocket(ClientSocket);
WSACleanup();
return 1;
}
//get file size.
unsigned long FileSize;
int iResult = readBytes(ClientSocket, &FileSize, sizeof(FileSize));
if (iResult <= 0)
{
fclose(fp);
closesocket(ClientSocket);
WSACleanup();
return 1;
}
FileSize = ntohl(FileSize);
char mfcc[1024];
while (FileSize > 0)
{
int Received = readBytes(ClientSocket, mfcc, min(sizeof(mfcc), FileSize));
if (Received <= 0)
{
fclose(fp);
closesocket(ClientSocket);
WSACleanup();
return 1;
}
if (fwrite(mfcc, 1, Received, fp) != Received)
{
printf("Error writing file\n");
fclose(fp);
closesocket(ClientSocket);
WSACleanup();
return 1;
}
FileSize -= Received;
}
fflush(fp);
fclose(fp);
return 0;
}
int readBytes(套接字、void*缓冲区、int buflen)
{
int-total=0;
无符号字符*pbuf=(无符号字符*)缓冲区;
而(buflen>0)
{
int-iResult=recv(s,pbuf,buflen,0);
如果(iResult<0)
{
if(WSAGetLastError()==WSAEWOULDBLOCK)
{
//(可选)使用select()等待
//套接字之前要读取更多字节
//再次调用recv()。。。
继续;
}
printf(“recv错误:%d\n”,WSAGetLastError());
返回套接字错误;
}
else if(iResult==0)
{
printf(“断开连接的\n”);
返回0;
}
其他的
{
pbuf+=iResult;
buflen-=iResult;
总计+=iResult;
}
}
返回总数;
}
int Socket_Manip::FILE_UPLOAD()
{
//开始下载
文件*fp=fopen(“C::\\Users\\Server\\Downloads\\transfer.zip”,“wb”);
如果(fp==NULL)
{
printf(“创建文件时出错”);
闭合插座(ClientSocket);
WSACleanup();
返回1;
}
//获取文件大小。
未签名的长文件大小;
int-iResult=readBytes(ClientSocket,&FileSize,sizeof(FileSize));
如果(iResult 0)
{
接收的int=readBytes(ClientSocket,mfcc,min(sizeof(mfcc),FileSize));
如果(收到0)
{
int-iResult=send(s,pbuf,buflen,0);
如果(iResult<0)
{
if(WSAGetLastError()==WSAEWOULDBLOCK)
{
//(可选)使用select()等待
//套接字之前要有更多的写入空间
//再次调用send()。。。
继续;
}
printf(“发送错误:%d\n”,WSAGetLastError());
返回套接字错误;
}
else if(iResult==0)
{
printf(“断开连接的\n”);
返回0;
}
其他的
{
pbuf+=iResult;
buflen-=iResult;
总计+=iResult;
}
}
返回总数;
}
int File_Transfer_Manip()
{
字符缓冲区[1024];
文件*fp=fopen(“C:\\Users\\r4minux\\Downloads\\upload.zip”,“rb”);
如果(!fp)
{
printf(“打开文件时出错”);
返回1;
}
fseek(fp,0,SEEK_END);
无符号长文件大小=ftell(fp);
fseek(fp,0,SEEK_集);
无符号长tmpFileSize=htonl(文件大小);
int-iResult=sendBytes(ConnectSocket,&tmpFileSize,sizeof(tmpFileSize));
如果(iResult 0)
{
long Size=fread(缓冲区,1,min(缓冲区大小,文件大小),fp);
如果(尺寸)