发送文件

来源:互联网 发布:linux 监控tomcat日志 编辑:程序博客网 时间:2024/06/06 08:32
//服务器端#include<iostream>#include<fstream>#include<WinSock2.h>#include<fstream>#define ONE_PAGE 1024*4using namespace std;#pragma comment(lib,"ws2_32.lib")class FileHeader{public :void SetFileName(char *FileName){strcpy_s(this->FileName,MAX_PATH,FileName);}char * GetFileName(){return this->FileName;}void SetFileSize(int FileSize){this->FileSize=FileSize;}int GetFileSize(){return this->FileSize;}private:char FileName[MAX_PATH];int FileSize;};int main(){//加载库WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ){return 1;}if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 ) {WSACleanup( );return 1; }//创建socketSOCKET SocketListen;SocketListen =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(SocketListen==INVALID_SOCKET){cout<<"socket at error. \n"<<endl;closesocket(SocketListen);WSACleanup();return 0;}//bindsockaddr_in Service; Service.sin_family = AF_INET;Service.sin_addr.s_addr = inet_addr( "127.0.0.1" );Service.sin_port = htons( 1234 );// bind to server.if ( bind( SocketListen, (SOCKADDR*) &Service, sizeof(sockaddr_in) ) == SOCKET_ERROR){printf( "Failed to connect.\n" );closesocket(SocketListen);WSACleanup();return 0;}//监听listenif (listen( SocketListen, 10 ) == SOCKET_ERROR){closesocket(SocketListen);WSACleanup();printf("Error listening on socket.\n");}//接收acceptSOCKET SocketAccept;SocketAccept=accept(SocketListen,NULL,NULL);if(SocketAccept==INVALID_SOCKET){WSACleanup();closesocket(SocketListen);return 0;}//接收文件的名字和大小FileHeader File;if(SOCKET_ERROR==recv(SocketAccept,(char *)&File,sizeof(FileHeader),0)){cout<<"recv at error"<<endl;closesocket(SocketListen);closesocket(SocketAccept);WSACleanup();return 0;}//创建文件fstream fs;fs.open("G:\\计算机网络(第五版)谢希仁编著_课后习题答案.doc",fstream::binary|fstream::out|fstream::trunc);if(!fs){cout<<"打开文件失败"<<endl;closesocket(SocketListen);closesocket(SocketAccept);WSACleanup();return 0;}char szbuf[ONE_PAGE]={0};int FileSize=File.GetFileSize();//文件的大小while(FileSize>0){//读取一页到szbufint nSize=recv(SocketAccept,szbuf,ONE_PAGE,0);if(nSize>0){FileSize-=nSize;fs.write(szbuf,nSize);//szbuf写入到文件fs}//else//{//break;//}}fs.close();closesocket(SocketListen);closesocket(SocketAccept);WSACleanup();return 0;}//客户端#include<iostream>#include<fstream>#include<WinSock2.h>#define ONE_PAGE 1024*4using namespace std;#pragma comment(lib,"ws2_32.lib")class FileHeader//文件类{public :void SetFileName(char *FileName){strcpy_s(this->FileName,MAX_PATH,FileName);}char * GetFileName(){return this->FileName;}void SetFileSize(int FileSize){this->FileSize=FileSize;}int GetFileSize(){return this->FileSize;}private:char FileName[MAX_PATH];//文件名字int FileSize;//文件大小};int main(){//加载库WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) {     return 0;}if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 ) {WSACleanup( );return 0; }//创建socketSOCKET ConnectSocket;ConnectSocket =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(ConnectSocket==INVALID_SOCKET){cout<<"socket at error. \n"<<endl;WSACleanup();return 1;}//Connectsockaddr_in clientService; clientService.sin_family = AF_INET;clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );clientService.sin_port = htons( 1234 );// Connect to server.if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {cout<<"Failed to connect.\n";closesocket(ConnectSocket);WSACleanup();return 1;}fstream fs;//获得文件的名称和位置char *FileName="C:\\Users\\Administrator\\Desktop\\计算机网络(第五版)谢希仁编著_课后习题答案.doc";//打开文件fs.open(FileName,fstream::binary|fstream::in);if(!fs){cout<<"打开失败"<<endl;return 0;}//移动文件获得文件大小fs.seekg(0,fstream::end);int FileSize=fs.tellg();fs.seekg(0,fstream::beg);//定义文件对象FileHeader File;File.SetFileName(FileName);File.SetFileSize(FileSize);//见文件的名字大小发送到服务器if(SOCKET_ERROR==send(ConnectSocket,(const char *)&File,sizeof(FileHeader),0)){cout<<"发送失败"<<endl;return 0;}//读取文件内容char szbuf[ONE_PAGE]={0};while(1){fs.read(szbuf,ONE_PAGE);int nSize=fs.gcount();//读取的实际大小if(nSize>0){if(SOCKET_ERROR==send(ConnectSocket,szbuf,nSize,0)){continue;}}else{break;}}fs.close();closesocket(ConnectSocket);WSACleanup();return 0;}

0 0
原创粉丝点击