C socket

51365133 2008-07-02 05:32:57
//服务端.///
/********************************************************************
日期: 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);
}


注意client端当中的
//发送写入完成
nlen=send(m_socket,"00000",5,0);

为什么这里失败呢?跟踪发现m_socket改变,是什么原因造成的呢?
...全文
213 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
51365133 2008-07-02
  • 打赏
  • 举报
回复
char szBuf[1024];

nlen=recv(m_socket,szBuf,1024,0);

szBuf[nlen]='\0';<=====这里会越界

越界造成的.晕了,分都给你了,留两天大家以后都注意啦.

后边的都没有分了.分是4楼的了.
  • 打赏
  • 举报
回复
        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);
}
51365133 2008-07-02
  • 打赏
  • 举报
回复
// 每次都close了,请把这句移到while循环外面
不是的,估计你看错{}了.
xkyx_cn 2008-07-02
  • 打赏
  • 举报
回复

fclose(sfile); // 也要移到while循环外面
xkyx_cn 2008-07-02
  • 打赏
  • 举报
回复

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循环外面

}

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧