【发布时间】:2010-11-04 14:58:49
【问题描述】:
我正在学习使用套接字的 C/C++ 编程,并尝试将二进制文件从服务器移动到客户端。这是我在服务器端的内容。
ifstream file(argv[1],ios::binary|ios::ate)
size = new char[file.tellg()]
memblock = new char[size]
file.seekg(0,ios::beg);
file.read(memblock,size);
在将二进制文件的内容读入 memblock 后,我使用套接字函数 read 将其传输。
listen(sockd, 5);
newsock=accept(sockfd, NULL, NULL);
write(newsock, memblock, strlen(memblock));
delete[] memblock;
同时,在客户端
connect(sockfd, &servaddr, sizeof(servaddr));
read(sockfd, buffer, size);
ofstream output(argv[1], ios::binary);
output.write(buffer, strlen(buffer));
output.close();
delete[] buffer
我了解可能会出现一些错误,例如文件大小可能大于传输的数量,因此文件未完全复制。这只是程序的第一步,因此我将在以后进行必要的修改以分块传输。
现在源代码本身是 1kb(准确地说是 714 字节)。当我在服务器程序中加载它时,它正确报告 strlen(buffer) 为 715。运行客户端时,它也正确报告读取 715 个字节,并且我得到一个与 original_source_code.cpp 相同的漂亮输出文件
但是,我有一个 512 字节的 jpg 文件。服务器程序正确报告 strlen(buffer) 为 512,但是,客户端仅读取 4 个字节并停止。读取的字节数因文件格式不同而异,但它从未真正读取完整的缓冲区。但是,文本文件通过套接字传输而没有任何问题。
发生这种情况的任何原因?我什至无法在同一台机器上执行此操作,例如运行服务器实例并要求客户端实例连接到 127.0.0.1。
任何建议将不胜感激!
【问题讨论】:
标签: c++ sockets binaryfiles