社区
C语言
帖子详情
请问在LINUX下如何用C写传送目录及其目录下的所有文件
gyhs
2003-10-17 04:42:10
以前写了一个C/S下传送文件的程序。
现在想在客户端输入目录名,在服务端查找这个目录,并把目录和所有文件都传到
客户端。
请问传送目录这段程序应该怎么写啊?
初学者,向各位高手请教,谢谢了!!!
...全文
69
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
下的各种API以及
linux
下常用命令的使用,从开发环境的搭建到一行一行的编
写
小示例来完成各个API的调用,通过学习本课程可以很轻松进入
linux
、C语言高级编程的世界。
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"
目录
下的...
C语言
69,336
社区成员
243,078
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章