请问在LINUX下如何用C写传送目录及其目录下的所有文件

gyhs 2003-10-17 04:42:10
以前写了一个C/S下传送文件的程序。
现在想在客户端输入目录名,在服务端查找这个目录,并把目录和所有文件都传到
客户端。
请问传送目录这段程序应该怎么写啊?
初学者,向各位高手请教,谢谢了!!!
...全文
71 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuty2006 2003-11-20
  • 打赏
  • 举报
回复
mk
loadme_litbear 2003-11-20
  • 打赏
  • 举报
回复
给你个客户端测试,服务端的差不多都,以前学习时候写的,你参考一下思路吧,
服务端差不多,无非就是socket,bind,listen,accept,我自己在测试里面定义了传输协议
你可以写的简单点。



//---------------------------------------------------------------------------
//project : nspr Client Test
//usage: For test only.
//---------------------------------------------------------------------------

#include "protocol.h"

DataHeaderStruct Header;
PRUintn nPort = 60001;

/*
** 清除数据头
*/
void ClearDataHeader()
{
Header.header[0] = 0;
Header.header[1] = 0;
Header.header[2] = 0;
Header.header[3] = 0;
Header.header[4] = 0;
return;
}

/*
** 等待提交结果
*/
int WaitRequestReturn(PRFileDesc *pConnection)
{
pConnection->methods->fsync(pConnection);
PR_Read(pConnection, Header.header, sizeof(Header));
Header.header[0] = 0;
return TEST_OK;
}

/*
** 提交连接申请
*/
int SendConnectionRequest(PRFileDesc *pConnection)
{
PR_Write(pConnection, Header.header, sizeof(Header));
return TEST_OK;
}

/*
** 打开连接
*/
PRFileDesc *OpenConnection(char *ServerIP)
{
PRFileDesc *pConnection;
PRNetAddr ServerAddr;
PRStatus prstatus;
PRSocketOptionData socketoption;

PR_InitializeNetAddr(PR_IpAddrAny, nPort, &ServerAddr);
PR_StringToNetAddr(ServerIP, &ServerAddr);
pConnection = PR_NewTCPSocket();
socketoption.option = PR_SockOpt_Nonblocking;
socketoption.value.non_blocking = PR_FALSE;
prstatus = PR_SetSocketOption(pConnection, &socketoption);

if (prstatus != PR_SUCCESS) {
printf("设置连接参数失败\r\n");
pConnection = NULL;
return pConnection;
}

prstatus = PR_Connect(pConnection, &ServerAddr, PR_INTERVAL_NO_TIMEOUT);
if (prstatus != PR_SUCCESS) {
printf("连接服务器失败\r\n");
pConnection = NULL;
return pConnection;
}

//发送连接申请
Header.header[1] = 1;
if (SendConnectionRequest(pConnection) == TEST_FAILURE) {
pConnection = NULL;
return pConnection;
}

//等待申请返回
if (WaitRequestReturn(pConnection) == TEST_FAILURE) {
pConnection = NULL;
return pConnection;
}

return pConnection;
}

/*
** 发送文件
*/
int File_Send(char *pName, PRFileDesc *pConnection)
{
PRFileDesc *File_fd;
PRFileInfo fileinfo;

PR_GetFileInfo(pName, &fileinfo);
File_fd = PR_Open (pName, PR_RDONLY, 0);

Header.header[0] = fileinfo.size;
Header.header[1] = 2;
Header.header[4] = 0;
strcpy(Header.filename, pName);

//send file code here
pConnection->methods->transmitfile(pConnection, File_fd, &Header,
sizeof(Header), PR_TRANSMITFILE_KEEP_OPEN,
PR_INTERVAL_NO_TIMEOUT);
PR_Close(File_fd);
WaitRequestReturn(pConnection);
ClearDataHeader();
return TEST_OK;
}

/*
** 对文件名处理
** 当用户输入为文件时调用发送函数
** 当用户输入为目录时对目录进行递归处理
*/
int File_Get(char *pName, PRFileDesc *pConnection)
{
PRUintn counter;
int pNameLength;
PRDir *dir;
PRDirEntry *dirEntry;
PRFileInfo FileInfo;
char fileName[sizeof(Header.filename)];

strcpy(fileName, pName);

//得到文件属性
if (PR_GetFileInfo(pName, &FileInfo) == PR_SUCCESS) {

//处理文件
if (FileInfo.type == PR_FILE_FILE) {
printf ("文件: %s \r\n", pName);
//发送文件
if (File_Send(pName, pConnection) == TEST_FAILURE) {
printf ("发送文件失败 \r\n");
}
else {
//SendConnectionRequest(pConnection);
//WaitRequestReturn(pConnection);
printf("文件大小 %i \r\n", FileInfo.size);
printf("文件发送成功 \r\n");
}
}

//处理目录
else if (FileInfo.type == PR_FILE_DIRECTORY) {
printf("目录: %s \r\n", pName);
dir = PR_OpenDir(pName);

//枚举目录下的元素
while (true) {
dirEntry = PR_ReadDir(dir, PR_SKIP_BOTH);

//递归调用结束点
if (dirEntry == NULL)
break;

pNameLength = PL_strlen(fileName);
fileName[pNameLength] = '\\';
fileName[pNameLength + 1] = '\0';
for (counter = 0 ;counter < PL_strlen(dirEntry->name) ;counter++) {
pNameLength = PL_strlen(fileName);
fileName[pNameLength] = (char) dirEntry->name[counter];
fileName[pNameLength + 1] = '\0';
}
fileName[PL_strlen(fileName) + counter] = '\0';

/*
** 对目录进行递归
*/
File_Get(fileName, pConnection);

strcpy(fileName, pName);
}
}
}

return TEST_OK;
}


/*
** 从命令行读取文件名进行处理
*/
int GetFileName(PRFileDesc *pConnection, char *ServerIP)
{
char filename[sizeof(Header.filename)];

//数据发送命令行处理
while (true) {
printf("\r\n 当前服务器: [%s],输入 end 命令断开连接 \r\n", ServerIP);
printf("输入要上传的文件名或者目录名(包括路径) \r\n");
scanf("%s", filename);

//断开指令判断
if ((filename[0] == 'e') && (filename[1] == 'n') &&
(filename[2] == 'd') && (filename[3] == '\0')) {
return 0;
}

//进行文件传输
if (File_Get(filename, pConnection) == TEST_FAILURE) {
printf("处理输入出错 \r\n");
continue;
}
}

return TEST_OK;
}


/*
** 任务调度
*/
int StartClient(char *ServerIP)
{
PRFileDesc *pConnection;

pConnection = OpenConnection(ServerIP);
if (pConnection == NULL)
return TEST_FAILURE;

if(GetFileName(pConnection, ServerIP) == TEST_FAILURE)
return TEST_FAILURE;

return TEST_OK;
}


/*
** 主程序入口
*/
int main(int argc, char **argv)
{
char ServerIP[16];

/* 命令行处理 */
for (;;) {
printf("\r\n [文件上传客户端],输入 end 命令结束此程序 \r\n");
printf("请输入服务器IP地址: \r\n");
scanf ("%s", ServerIP);

//结束指令判断
if ((ServerIP[0] == 'e') && (ServerIP[1] == 'n') &&
(ServerIP[2] == 'd') && (ServerIP[3] == '\0')) {
return 0;
}
StartClient(ServerIP);
}
return 0;
}
loadme_litbear 2003-10-22
  • 打赏
  • 举报
回复
有cvs了,兄弟何必呢
gyhs 2003-10-22
  • 打赏
  • 举报
回复
这有特别任务的,也算是自己练习一下,大家就帮帮忙嘛
gyhs 2003-10-19
  • 打赏
  • 举报
回复
请大家帮帮忙
fwinfwin 2003-10-18
  • 打赏
  • 举报
回复
分解为传送文件和建立文件夹就可以了阿!
zhu1981 2003-10-18
  • 打赏
  • 举报
回复
抱歉
我想我走错门拉

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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