64,641
社区成员
发帖
与我相关
我的任务
分享
//服务端.///
/********************************************************************
日期: 2008/07/02
时间: 2:7:2008 13:35
文件: AppLoad.cpp
作者: Ywp
功能: 文件下载
修改:
*********************************************************************/
#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <io.h>
//////////////////////////////////////////////////////////////////////////
#pragma comment(lib,"Ws2_32.lib")
#define MAX_LEN 255
//////////////////////////////////////////////////////////////////////////
int fn_init(void);
int fn_exts(char *szfile);
int fn_wlog(char *szfile,char *szFormat,...);
//////////////////////////////////////////////////////////////////////////
//AppLoad flog nport
int main( int argc, char *argv[ ], char *envp[ ] )
{
//char szLog[MAX_PATH];
//int nPort;
char szLog[MAX_PATH]="E:\\AppUpLoad\\bin\\AppLoad.log";
int nPort=6655;
//strcpy(szLog,argv[1]);
//nPort=atoi(argv[2]);
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen;
if (1==fn_init())
{
fn_wlog(szLog,"Code:%dAppLoad fn_init 失败!",GetLastError());
return -1;
}
SOCKET g_listen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==g_listen)
{
fn_wlog(szLog,"Code:%dAppLoad socket 失败!",GetLastError());
WSACleanup();
return -1;
}
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)nPort);
//绑定端口
if(bind(g_listen,(struct sockaddr *)&local,sizeof(local))!=0)
{
fn_wlog(szLog,"Code:%dAppLoad bind 失败!",GetLastError());
closesocket(g_listen);
WSACleanup();
return -1;
}
//打开监听
if(listen(g_listen,10)!=0)
{
fn_wlog(szLog,"Code:%dAppLoad listen 失败!",GetLastError());
closesocket(g_listen);
WSACleanup();
return -1;
}
fromlen=sizeof(from);
SOCKET m_socket=accept(g_listen,(struct sockaddr*)&from,&fromlen);
if(m_socket==INVALID_SOCKET)
{
fn_wlog(szLog,"Code:%dAppLoad accept 失败!",GetLastError());
closesocket(g_listen);
WSACleanup();
return -1;
}
char szFile[MAX_PATH];
//接收文件名
int nRet=recv(m_socket,szFile,MAX_PATH,0);
szFile[nRet]='\0';
if (fn_exts(szFile))
{
//文件不存在
send(m_socket,"00001",5,0);
fn_wlog(szLog,"AppLoad %s 不存在!",szFile);
closesocket(g_listen);
WSACleanup();
return -1;
}
char szBuf[1024];
int nRead=0;
FILE *sfile=fopen(szFile,"rb");
//文件打开成功
send(m_socket,"00000",5,0);
int rflg=1;
while(!feof(sfile))
{
Sleep(50);
if (rflg)
{
//获取发送结果
nRet=recv(m_socket,szBuf,5,0);
szBuf[nRet]='\0';
//接收完成
if (strcmp(szBuf,"00000")!=0)
continue;
//退出
if (strcmp(szBuf,"exit")==0)
break;
//获取文件数据
nRead=fread(szBuf,sizeof(char),1024,sfile);
szBuf[nRead]='\0';
}
//发送文件数据
nRet=send(m_socket,szBuf,nRead,0);
if (nRet=!nRead)
continue;
rflg=1;
}
//发送结束
if (feof(sfile))
send(m_socket,"exit",4,0);
//关闭文件
fclose(sfile);
//关闭Socket
closesocket(m_socket);
closesocket(g_listen);
return 0;
}
/*********************************************************************
函数: fn_init
作者: Ywp
日期: 2:7:2008 14:29
功能: 初始化Socket
参数:
返回值: 1:失败 0:成功
修改:
**********************************************************************/
int fn_init(void)
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
return 1;
if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
return 1;
}
return 0;
}
/*********************************************************************
函数: fn_wlog
作者: Ywp
日期: 2:7:2008 14:30
功能: 写日值
参数: szfile 日值文件名 szFormat格式
返回值: -1:失败 0成功
修改:
**********************************************************************/
int fn_wlog(char *szfile,char *szFormat,...)
{
FILE *log;
char dbuf[9],tbuf[9];
char szMsg[MAX_LEN];
va_list vl;
va_start(vl,szFormat);
_vsnprintf(szMsg,MAX_LEN,szFormat,vl);
va_end(vl);
log=fopen(szfile,"a+");
if (log==NULL)
return -1;
_strdate(dbuf);
_strtime(tbuf);
fprintf(log,"%s %s:%s\n",dbuf,tbuf,szMsg);
fclose(log);
return 0;
}
/*********************************************************************
函数: fn_exts
作者: Ywp
日期: 2:7:2008 14:31
功能: 文件是否存在
参数: 0存在 1不存在
返回值:
修改:
**********************************************************************/
int fn_exts(char *szfile)
{
if (access(szfile,0)==0)
return 0;
return 1;
}
//////////////////////////////////////////////////////////////////////////////////
测试client端
//////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"Ws2_32.lib")
void main( int argc, char *argv[ ], char *envp[ ] )
{
int nPort=6655;
char szFile[MAX_PATH]="f:\\aaa\\a.jpg";
WSADATA wsaData;
struct sockaddr_in local;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
return ;
if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
return ;
}
SOCKET m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==m_socket)
{
return ;
}
local.sin_family=AF_INET;
local.sin_addr.s_addr=inet_addr("172.28.131.22");;
local.sin_port=htons(nPort);
if(connect(m_socket,(struct sockaddr *)&local,sizeof(local))!=0)
{
WSACleanup();
return ;
}
char szBuf[1024];
int nlen=0;
//发送文件名
send(m_socket,szFile,strlen(szFile),0);
//接收文件状态
nlen=recv(m_socket,szBuf,5,0);
szBuf[nlen]='\0';
//退出
if (strcmp(szBuf,"00001")==0)
{
printf("文件不存在!");
return;
}
FILE *sfile=fopen("tmp.dat","wb");
//文件初始化完成.
send(m_socket,"00000",5,0);
int wflg=1;
while(1)
{
Sleep(50);
if (wflg)
{
//接收文件内容
nlen=recv(m_socket,szBuf,1024,0);
if (nlen==-1)
continue;
//退出
if (strcmp(szBuf,"exit")==0)
break;
szBuf[nlen]='\0';
//写入文件
fwrite(szBuf,sizeof(char),nlen,sfile);
}
//发送写入完成
nlen=send(m_socket,"00000",5,0); //注意:为什么这里发送失败呢?
if (nlen!=5)
{
wflg=0;
continue;
}
wflg=1;
}
fclose(sfile);
closesocket(m_socket);
}
if (wflg)
{
//接收文件内容
nlen=recv(m_socket,szBuf,1024,0);
if (nlen==-1)
continue;
//退出
if (strcmp(szBuf,"exit")==0)
break;
szBuf[nlen]='\0';<=====这里会越界
//写入文件
fwrite(szBuf,sizeof(char),nlen,sfile);
}
fclose(sfile); // 也要移到while循环外面
while(1)
{
Sleep(50);
if (wflg)
{
//接收文件内容
nlen=recv(m_socket,szBuf,1024,0);
if (nlen==-1)
continue;
//退出
if (strcmp(szBuf,"exit")==0)
break;
szBuf[nlen]='\0';
//写入文件
fwrite(szBuf,sizeof(char),nlen,sfile);
}
//发送写入完成
nlen=send(m_socket,"00000",5,0); //注意:为什么这里发送失败呢?
if (nlen!=5)
{
wflg=0;
continue;
}
wflg=1;
}
fclose(sfile);
closesocket(m_socket); // 每次都close了,请把这句移到while循环外面
}