//服务器端
#include<iostream>
#include<fstream>
#include<WinSock2.h>
#include<fstream>
#define ONE_PAGE 1024*4
using 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;
}
//创建socket
SOCKET SocketListen;
SocketListen =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(SocketListen==INVALID_SOCKET)
{
cout<<"socket at error. \n"<<endl;
closesocket(SocketListen);
WSACleanup();
return 0;
}
//bind
sockaddr_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;
}
//监听listen
if (listen( SocketListen, 10 ) == SOCKET_ERROR)
{
closesocket(SocketListen);
WSACleanup();
printf("Error listening on socket.\n");
}
//接收accept
SOCKET 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)
{
//读取一页到szbuf
int 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*4
using 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;
}
//创建socket
SOCKET ConnectSocket;
ConnectSocket =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(ConnectSocket==INVALID_SOCKET)
{
cout<<"socket at error. \n"<<endl;
WSACleanup();
return 1;
}
//Connect
sockaddr_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;
}