文件传输的原理:发送方把文件读到socket发送端缓冲区中,接收方把socket接收端缓端冲区中的数据写到一个新文件中。当然了,大文件需要循环读写!
服务器端为发送端:
#include "stdafx.h" #include<winsock2.h> #include<iostream> #pragma comment(lib,"ws2_32.lib") using namespace std; int main(){ WSADATA wsaData; SOCKET s; int errStartup,errBind; errStartup=WSAStartup(MAKEWORD(2,2),&wsaData); if(errStartup!=0){ cout<<"初始化失败"<<endl; return -1; } s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(s==INVALID_SOCKET){ cout<<"创建socket失败"<<endl; return -2; } SOCKADDR_IN addr; memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addr.sin_port=htons(30000); errBind= bind(s,(SOCKADDR*)&addr,sizeof(addr)); if(errBind!=0){ cout<<"bind failed!"<<endl; return -3; } listen(s,3); SOCKADDR_IN addrClient; int len=sizeof(addrClient); char *filename="e:\winSQL.zip"; while (true) { SOCKET sockClient=accept(s,(SOCKADDR*)&addrClient,&len); //用于发送文件名 char *sendBuf="winSQL.zip"; int sendNum= send(sockClient,sendBuf,strlen(sendBuf)+1,0); char sendFileBuf[1024]; memset(sendFileBuf,0,sizeof(sendFileBuf)); DWORD dwRead=NULL; HANDLE hFile=CreateFile(filename,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); while (true) { if(!ReadFile(hFile,sendFileBuf,1024,&dwRead,0)){ cout<<"read buf error!"<<endl; break; }else if(dwRead==0) { cout<<"send over"<<endl; break; }else { send(sockClient,sendFileBuf,dwRead,0); } } CloseHandle(hFile); shutdown(sockClient,SD_BOTH); closesocket(sockClient); } closesocket(s); WSACleanup(); system("pause"); return 0; }
客户端为接收端:
#include "stdafx.h" #include <WinSock2.h> #include <iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") int _tmain(int argc, TCHAR *argv[]) { WSADATA wsaData; SOCKADDR_IN s; int conerr; WSAStartup(MAKEWORD(2,2),&wsaData); SOCKET clientSock=socket(AF_INET,SOCK_STREAM,0); memset(&s,0,sizeof(s)); s.sin_family=AF_INET; s.sin_addr.S_un.S_addr=inet_addr("172.18.4.161"); s.sin_port=htons(30000); conerr= connect(clientSock,(SOCKADDR*)&s,sizeof(s)); if(conerr!=0){ cout<<"connect failed:"<<conerr<<endl; } //接收文件名,并拼接文件存放路径 char recBuf[128]; recv(clientSock,recBuf,128,0); char filename[128]="c:\"; strcat(filename,recBuf); cout<<"文件位置"<<filename<<endl; char recFileBuf[1024]; int numRead; DWORD dwWrite; DWORD tmp=0; HANDLE hFile=CreateFile(filename,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); while (true) { numRead=recv(clientSock,recFileBuf,1024,0); if(numRead==SOCKET_ERROR){ cout<<"connect error"<<endl; break; } tmp=tmp+numRead; if(numRead==0){ cout<<"receive over"<<endl; break; } if(!WriteFile(hFile,recFileBuf,numRead,&dwWrite,0)){ cout<<"write failed!"<<endl; break; } } cout<<"共接收:"<<tmp<<" 字节"<<endl; CloseHandle(hFile); system("pause"); return 0; }