从套接字 C++ 发送和接收文件

probleim with sending and receiving file from socket c++

本文关键字:文件 套接字 C++      更新时间:2023-10-16

im 尝试将文件从服务器发送到客户端 我在我的服务器中获得了这个功能:

UINT CServerDlg::sendFile(WPARAM pParam)
{
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
return FALSE;
}
else {
if (AfxSocketInit() == FALSE)
{
return FALSE;
}
CSocket ServerSocket;
if (ServerSocket.Create(Dport, SOCK_STREAM, NULL) == 0)
{
return FALSE;
}
else
{
if (ServerSocket.Listen(32) == FALSE)
{
ServerSocket.Close();
return FALSE;
}
}

CSocket Connector;
if (ServerSocket.Accept(Connector))
{
char* buffer = NULL;
FILE* fi = fopen(file_name.c_str(), "rb");
if (!fi)
return 0;
//get the file length
fseek(fi, 0, SEEK_END);
long file_size = ftell(fi);
fseek(fi, 0, SEEK_SET);
//send packet's length first and then send the packet
//(one file includes multiple packets) and SIZE_BUFFER=4096
int result=-1;
int size = (file_size < SIZE_BUFFER) ? (int)file_size : SIZE_BUFFER;
while (file_size >= (long long)SIZE_BUFFER) {
fread(buffer, size, 1, fi);
result = send(Connector, (char*)&file_size, sizeof(int), 0);
if (result == SOCKET_ERROR) return 0;
do { size = send(Connector,buffer, size, 0); } while (size == -1);
memset(buffer, 0, SIZE_BUFFER);
file_size = file_size - (long long)size;
}
if (file_size != 0) {
if (send(Connector, (char*)&file_size, sizeof(int), 0) == SOCKET_ERROR) return 0;
fread(buffer, file_size, 1, fi);
do { size = send(Connector,buffer, file_size, 0); } while (size == -1);
}
delete[] buffer;
fclose(fi);
}
else {
return 0;
}
Connector.Close();
ServerSocket.Close();
}
return 1;
}

在客户端文件上,我得到了这个:

bool MainDlg::DownloadFile(char* file_name, int port) {
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
return FALSE;
}
//copy tu demo
if (AfxSocketInit() == FALSE)
{
return FALSE;
}
CSocket ClientSocket;
ClientSocket.Create();
if (ClientSocket.Connect(_T("127.0.0.1"), port) != 0)
{
char* buffer = NULL;
int size = 0;
FILE* fo = fopen(file_name, "wb");
recv(ClientSocket, (char*)&size, sizeof(int), 0);
while (size >= SIZE_BUFFER) {
do { size = recv(ClientSocket, (char*)buffer, SIZE_BUFFER, 0); } while (size == -1);
fwrite((char*)buffer, size, 1, fo);
memset(buffer, 0, SIZE_BUFFER);
size = recv(ClientSocket, (char*)&size, sizeof(int), 0);
}
if ((size != SOCKET_ERROR)) size = recv(ClientSocket, (char*)buffer, size, 0);
else return 0;
delete[] buffer;
fclose(fo);
}
else {
return 0;
}
ClientSocket.Close();
return 1;
}

服务器和客户端已连接,但似乎无法发送数据包。即使它发送失败,但执行文件没有调用错误,但是当我调试时它确实如此。我在fread(buffer, file_size, 1, fi)收到一个未知错误: 在 Server .exe 中0x00007FF6F17BDF28时未处理的异常:将无效参数传递给将无效参数视为致命的函数。

您必须为缓冲区分配内存,因为fread的第一个参数:

指向大小至少为 (size*count( 字节的内存块的指针,转换为void*

使用mallocnew

我建议使用std::array,以免担心删除内存。