社区
C语言
帖子详情
请问在LINUX下如何用C写传送目录及其目录下的所有文件
gyhs
2003-10-17 04:42:10
以前写了一个C/S下传送文件的程序。
现在想在客户端输入目录名,在服务端查找这个目录,并把目录和所有文件都传到
客户端。
请问传送目录这段程序应该怎么写啊?
初学者,向各位高手请教,谢谢了!!!
...全文
77
7
打赏
收藏
请问在LINUX下如何用C写传送目录及其目录下的所有文件
以前写了一个C/S下传送文件的程序。 现在想在客户端输入目录名,在服务端查找这个目录,并把目录和所有文件都传到 客户端。 请问传送目录这段程序应该怎么写啊? 初学者,向各位高手请教,谢谢了!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
抱歉
我想我走错门拉
Linux
下C语言开发
Linux
下C语言开发
Linux
下C语言开发
Linux
下C语言开发流程C语言开发工具c语言代码编辑工具
Linux
C语言的编译器gccgcc 的安装和配置gcc对c语言的处理过程gcc的基础使用方法
Linux
C语言的调试工具gdbgdb的基础使用gdb运行...
linux
查找
目录
下的所有
文件
中是否含有某个字符串
$ grep "被查找的字符串"
文件
名例子:在当前
目录
里第一级
文件
夹中寻找包含指定字符串的.in
文件
grep "thermcontact" */*.in 从
文件
内容查找与正则表达式匹配的行: $ grep –e “正则表达式”
文件
名 查找时不区分大...
linux
查询
目录
下包含关键字的所有
文件
查找
目录
下的所有
文件
中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找
目录
下的所有
文件
中是否含有某个字符串,并且只打印出
文件
名 find .|xargs grep -ri "IBM" -l 1.正则表达式 ...
Linux
下查找
目录
下的所有
文件
是否包含某字符串
很多时候我们需要找到某个
文件
夹下包含某个字符串的所有
文件
,比如已知一个变量名,但是不知道定义在哪个
文件
里,就可以搜一下。
目录
下的所有
文件
中查找字符串 find .| xargs grep -ri "class"
目录
下的...
Linux
文件
系统的
目录
结构
转自:
Linux
文件
系统的
目录
结构
Linux
下的
文件
系统为树形结构,入口为/ 树形结构下的
文件
目录
: 无论哪个版本的
Linux
系统,都有这些
目录
,这些
目录
应该是标准的。各个
Linux
发行版本会存在一些小小的差异,但总体来...
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章