从套接字 C++ 发送和接收文件
probleim with sending and receiving file from socket c++
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*
。
使用malloc
或new
。
我建议使用std::array
,以免担心删除内存。
相关文章:
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 从套接字 C++ 发送和接收文件
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 从 PHP 调用已编译的C++可执行文件来创建套接字
- 无法从零MQ ZMQ_SERVER套接字中获取文件描述符
- read() 上的不同行为取决于写入不可写内存时表示文件、匿名管道或套接字的文件描述符
- 在通过套接字向服务器发送文件数据时,我得到了一些垃圾值?为什么
- 带有线程的 Linux 套接字文件描述符
- Python和C++之间使用本地文件套接字的进程间通信
- 套接字请求不返回整个文件
- 通过网络中的套接字进行文件传输时,该程序中的文件传输错误是什么
- 套接字编程:"接受:错误的文件描述符"
- 提升 ASIO 套接字使用文件描述符
- 通过套接字发送二进制文件.文本文件有效,其他文件无效
- 从套接字接收到二进制数据后,使用c++将二进制数据写入文件
- Unix 域套接字:发送文件描述符和 select()
- 更改 Linux 套接字文件权限
- 使用SFML TCP套接字和数据包破坏文件