printf("Listening To Client…\n");
//循环接收client端的连接请求
sockaddr_in ClientAddr;
int nAddrLen = sizeof(sockaddr_in);
SOCKET sClient;
//取队列最前端客户连接请求,创建套接字连接通道
while((sClient=::accept(sListen,(sockaddr*)&ClientAddr,&nAddrLen))==INVALID_SOCKET)
{}
//解析消息并进行相应的处理
//int count=10;//作为定时当程序执行10s未完成时直接退出
//while(ProcessMsg(sClient)==true&&count>0)
//{
// Sleep(1000);
// count--;
//}
while(ProcessMsg(sClient)==true)
{
Sleep(1000);
}
//关闭同客户端的连接
::closesocket(sClient);
::closesocket(sListen);
}
//打开文件
bool OpenFile(CCSDef::TMSG_HEADER* pMsgHeader,SOCKET sClient)
{
CCSDef::TMSG_FILENAME* pRequstFileNameMsg=(CCSDef::TMSG_FILENAME*)pMsgHeader;
//对文件名进行处理
char *p1,*p2;
for(p1=pRequstFileNameMsg->szFileName,p2=g_szNewFileName;*p1!='\0';p1++,p2++)
{
if(*p1!='\n')
{
*p2=*p1;
}
if(*p2=='\\')//将'\'转换为'\\'
{
*(++p2)='\\';
}
}
*p2='\0';
ReadFile(sClient);
return true;
}
//传送文件
bool SendFile(SOCKET sClient)
{
if (NULL == g_pBuff)
{//如果缓冲区为空
ReadFile(sClient);
}
int nPacketBufferSize = MAX_PACKET_SIZE - 2 * sizeof(int); // 每个数据包存放文件的buffer大小
// 如果文件的长度大于每个数据包所能传送的buffer长度那么就分块传送
for (int i = 0; i < g_lLength; i += nPacketBufferSize)
{
CCSDef::TMSG_FILE tMsgFile;
tMsgFile.tFile.nStart = i;
if (i + nPacketBufferSize + 1> g_lLength)
{//文件块已经是最后一块
tMsgFile.tFile.nSize = g_lLength - i;
}
else
{
tMsgFile.tFile.nSize = nPacketBufferSize;
}
memcpy(tMsgFile.tFile.szBuff, g_pBuff + tMsgFile.tFile.nStart, tMsgFile.tFile.nSize);//copy到缓冲区
::send(sClient, (char*)(&tMsgFile), sizeof(CCSDef::TMSG_FILE), 0);
Sleep(0.5);
}
delete [] g_pBuff;
g_pBuff = NULL;
return true;
}
//读取文件进缓冲区
bool ReadFile(SOCKET sClient)
{
if(g_pBuff!=NULL)
{//如果缓冲区不为空
return true;
}
//打开文件
FILE *pFile;
if((pFile = fopen(g_szNewFileName, "rb"))==NULL)
{//文件打开失败,发送错误报告
printf("Cannot find the file, request the client input file name again\n");
CCSDef::TMSG_ERROR_MSG tMsgErrorMsg(MSG_OPENFILE_ERROR);
::send(sClient, (char*)(&tMsgErrorMsg), sizeof(CCSDef::TMSG_ERROR_MSG), 0);
return false;
}
//传送文件长度到Client
fseek(pFile,0,SEEK_END);//重定位指针到文件末尾
g_lLength=ftell(pFile);//返回文件指针相对于文件头的偏移量
printf("File Length = %d\n", g_lLength);
CCSDef::TMSG_FILELENGTH tMsgFileLength(g_lLength);
::send(sClient,(char*)(&tMsgFileLength), sizeof(CCSDef::TMSG_FILELENGTH), 0);
// 处理文件全路径名,把文件名分解出来
//磁盘号,目录,文件名,后缀名
char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFname[_MAX_FNAME], szExt[_MAX_EXT];
_splitpath(g_szNewFileName, szDrive, szDir, szFname, szExt);
strcat(szFname,szExt);
CCSDef::TMSG_FILENAME tMsgFileName;
strcpy(tMsgFileName.szFileName, szFname);
printf("Send File Name: %s\n", tMsgFileName.szFileName);
::send(sClient, (char*)(&tMsgFileName), sizeof(CCSDef::TMSG_FILENAME), 0);
//分配缓冲区,读取文件内容
g_pBuff = new char[g_lLength + 1];
if (g_pBuff == NULL)
{
return false;
}
fseek(pFile, 0, SEEK_SET);
fread(g_pBuff, sizeof(char), g_lLength, pFile);
g_pBuff[g_lLength] = '\0';
fclose(pFile);
return true;
}
【2】客户端:
头文件同服务器端头文件
源程序文件:
[cpp]
/*Client.cpp*/
#include"Client.h"
long g_lLength = 0;
char* g_pBuff = NULL;
char g_szFileName[MAXFILEDIRLENGTH];
char g_szBuff[MAX_PACKET_SIZE+1];
SOCKET g_sClient;
// 初始化socket库
bool InitSocket();
// 关闭socket库
bool CloseSocket();
// 把用户输入的文件路径传送到server端
bool SendFileNameToServer();
// 与server端连接
bool ConectToServer();
// 打开文件失败
bool OpenFileError(CCSDef::TMSG_HEADER *pMsgHeader);
// 分配空间以便写入文件
bool AllocateMemoryForFile(CCSDef::TMSG_HEADER *pMsgHeader);
// 写入文件
bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader);
// 处理server端传送过来的消息
bool ProcessMsg();
int main()
{
while(1)
{
InitSocket();
ConectToServer();
CloseSocket();
}
//system("pause");
return 0;
}
// 初始化socket库
bool InitSocket()
{
//初始化SOCKET
WSADATA wsaData;
WORD socketVersion=MAKEWORD(2,2);
if(::WSAStartup(socketVersion,&wsaData)!=0)
{
printf("Init socket dll error\n");
exit(-1);
}
return true;
}
// 关闭socket库
bool CloseSocket()
{
// 关闭套接字
::closesocket(g_sClient);
// 释放winsock库
::WSACleanup();
return true;
}
// 把用户输入的文件路径传送到server端
bool SendFileNameToServer()
{
char szFileName[MAXFILEDIRLENGTH];
printf("Input the File Directory: ");
//fgets(szFileName, MAXFILEDIRLENGTH, stdin);
strcpy(szFileName,"E:\\test1.A_exp");
// 把文件路径发到server端
CCSDef::TMSG_FILENAME tMsgRequestFileName;
strcpy(tMsgRequestFileName.szFileName, szFileName);
if (::send(g_sClient, (char*)(&tMsgRequestFileName), sizeof(CCSDef::TMSG_FILENAME), 0) == SOCKET_ERROR)
{
printf("Send File Name Error!\n");
exit(-1);
}
return true;
}
// 与server端连接
bool ConectToServer()
{
// 初始化socket套接字
if ((g_sClient = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR)
{
printf("Init Socket Error!\n");
exit(-1);
}
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(PORT);
servAddr.sin_addr.S_un.S_addr = ::inet_addr(SERVER_IP);
if ((::connect(g_sClient, (sockaddr*)&servAddr, sizeof(sockaddr_in))) == INVALID_SOCKET)
{
printf("Connect to Server Error!\n");
exit(-1);
}
// 输入文件路径传输到server端
SendFileNameToServer();
// 接收server端传过来的信息,直到保存文件成功为止
while (ProcessMsg() == true)
{
Sleep(1000);
}
return true;
}
// 打开文件失败
bool OpenFileError(CCSDef::TMSG_HEADER *pMsgHeader)
{
if (g_pBuff != NULL)//如果缓冲区内有数据
return true;
assert(pMsgHeader != NULL);
printf("Cannot find file!\n");
// 重新输入文件名称
SendFileNameToServer();
return true;
}
// 分配空间以便写入文件
bool AllocateMemoryForFile(CCSDef::TMSG_HEADER *pMsgHeader)
{
assert(pMsgHeader != NULL);
if (g_pBuff != NULL)
{
return true;
}