用 VC+socket 传输大文件
来源:互联网 发布:mac如何删除程序 编辑:程序博客网 时间:2024/05/16 23:39
在这个程序中,客户端读取桌面的一个 1.48 GB (1,597,701,030 字节) 的RAR文件发送给服务器。因为这里仅用于学习,所以客户端要连接的目标地址使用127.0.0.1。服务器端接将收的文件文件保存在C盘根目录下。
为保证程序的可靠发送,程序采用TCP协议。经过反复试验得出结论,程序中的重中之重是双方的 ReadFile 和 WriteFile。相反 recv 和 send 不是重要的。为了使代码尽量简化,程序去掉所有错误检查,只让服务器端的accept函数提示一下有人发起连接。双方收发完文件之后直接退出程序。
//服务器端#include<iostream>#include<Windows.h>using namespace std;const int iBufferSize = 1024*1024;char buffer[iBufferSize];void main(){WSAData data;WSAStartup(MAKEWORD(2,2),&data);SOCKET s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);SOCKADDR_IN addr;addr.sin_family = AF_INET;addr.sin_port = htons(8888);addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);bind(s1, (SOCKADDR*)&addr, sizeof(addr));listen(s1, 5);int len = sizeof(addr);SOCKET s2 = accept(s1, (SOCKADDR*)&addr, & len);if(s2!=INVALID_SOCKET)cout<<" accept right"<<endl;LARGE_INTEGER i64FileSize, i64FileSizeCopy;recv(s2, (char*)&i64FileSize.QuadPart, sizeof(i64FileSize.QuadPart), 0);i64FileSizeCopy = i64FileSize;HANDLE hFile = CreateFile(L"c:\\a.rar", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);while( i64FileSize.QuadPart >0 ){ZeroMemory(buffer, iBufferSize);int size;size = recv(s2, buffer, iBufferSize, 0);DWORD dwNumBytes;while( TRUE ){if( i64FileSize.QuadPart < size )size = i64FileSize.QuadPart;WriteFile(hFile, buffer, size, &dwNumBytes, 0);i64FileSize.QuadPart -= dwNumBytes;if( dwNumBytes < size )size -= dwNumBytes;elsebreak;}}}
//客户端#include<iostream>#include<Windows.h>using namespace std;const int iBufferSize = 1024*1024;char buffer[iBufferSize];void main(){WSAData data;WSAStartup(MAKEWORD(2,2),&data);SOCKET s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);SOCKADDR_IN addr;addr.sin_family = AF_INET;addr.sin_port = htons(8888);addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");connect(s1, (SOCKADDR*)&addr, sizeof(addr));HANDLE hFile = CreateFile(L"C:\\Users\\ys\\Desktop\\Visual C++开发入行真功夫光盘二次.rar",GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);LARGE_INTEGER i64FileSize, i64FileSizeCopy;GetFileSizeEx(hFile, &i64FileSize);i64FileSizeCopy = i64FileSize;send(s1, (char*)&i64FileSize, sizeof(LARGE_INTEGER),0);while( i64FileSize.QuadPart > 0 ){DWORD dwNumBytes, dwNumberToRead = iBufferSize;while(TRUE){if( i64FileSize.QuadPart <= dwNumberToRead )dwNumberToRead = i64FileSize.QuadPart;ReadFile(hFile, buffer, dwNumberToRead, &dwNumBytes, 0);i64FileSize.QuadPart -= dwNumBytes;if( dwNumBytes < dwNumberToRead )dwNumberToRead -= dwNumBytes;elsebreak;}send(s1, buffer, iBufferSize, 0);cout<<"已发送 "<< (i64FileSizeCopy.QuadPart - i64FileSize.QuadPart)<<"B "<< (i64FileSizeCopy.QuadPart - i64FileSize.QuadPart)/1024<<"K "<< (i64FileSizeCopy.QuadPart - i64FileSize.QuadPart)/1024/1024<<"M "<< (i64FileSizeCopy.QuadPart - i64FileSize.QuadPart)/1024/1024/1024 <<"G"<<endl;}}
- 用 VC+socket 传输大文件
- VC ++ Socket传输文件
- vc 传输大文件
- C# Socket传输大文件
- socket网络传输大文件
- VC++使用Socket网络编程传输文件
- linux socket 传输大文件解决方案
- Java:Socket断点传输大文件
- socket在网络中传输传输大文件
- VC socket传输图片
- java支持大文件断点传输的Socket
- Android 中 Socket 基于TCP 传输大文件
- Windows Socket编程之TCP实现大文件的传输
- Windows Socket编程之UDP实现大文件的传输
- Java实现 Windows Socket TCP实现大文件的传输
- 简单的用socket传输文件程序。
- python实现用socket传输文件
- python实现用socket传输文件
- ios程序编译链接参数 all_load 的 ld duplicate symbol 的bug及修复
- PCI串口芯片954中的超时中断探讨
- js中动态定义变量
- lib和dll文件的区别和联系
- Javascript事件:this.value()和this.select()
- 用 VC+socket 传输大文件
- 生成静态库的一些问题-all_load
- pb中的六种窗体类型
- ClickOnce部署WinForm过程及错误处理
- SMS后台短信发送!
- 程序员的学习和积累
- 《Spring技术内幕》学习笔记2——IoC定位Bean定义资源 .
- ios在真机中将NSLog日志存入文件并保存到document目录
- super和this的应用