如何用c语言实现上传文件

如何用c语言实现上传文件,第1张

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。

1.C语言可以使用CStdioFile函数打开本地文件。使用类CInternetSession 创建并初始化一个Internet打开FTP服山衡务器文件。

CStdioFile继承自CFile,一个CStdioFile 对象代表一个用运行时函数fopen 打开逗码做的C 运行时流式文件。

流式文件是被缓冲的,而且可以以文本方式(缺省)或二进制方式打开。文本方式提供对硬回车—换行符对的特殊处理。当你将一个换行符(0x0A)写入一个文本方式的CStdioFile 对象时,字节对(0x0D,0x0A)被发送给该文件。当你读一个文件时,字节对(0x0D,0x0A)被翻译为一个字节(0x0A)。

CStdioFile 不支持Duplicate,LockRange,和UnlockRange 这几个CFile 函数。如果在CStdioFile 中调用了这几个函数,将会出现CNoSupported 异常。

使用类CInternetSession 创建并初始化一个或多个同时的Internet 会话。如果需要,还可描述与代理服务器的连接。

如果Internet连接必须在应用过程中保持着,可创建一个类CWinApp的CInternetSession成员。一旦已建立起Internet 会话,就可调用OpenURL。CInternetSession会通过调用全局函数AfxParseURL来为分析映射URL。无论协议类型如何,CInternetSession 解释URL并管理它。它可处理由URL资源“file://”标志的本地文件的请求。如果传给它的名字是本地文件,OpenURL 将返回一个指向CStdioFile对象的指针。

如果使用OpenURL在Internet服务器上打开一个URL,你可从此处读取信息。如果要执行定位在模唯服务器上的指定的服务(例如,HTTP,FTP或Gopher)行为,必须与此服务器建立适当的连接。

安全文件传输程序?就是TCP传输吧:随便写了下,好多地方都没怎么验证,比如待发送的文件是否存在;代码如下(此程序用于WINDOWS,我用的是VC调试的,LINUX下方法略有不同)文件接收端:#pragma comment(lib,"ws2_32.lib")#include <stdio.h>

#include <io.h>卖运正

#include <winsock2.h>

#include <fcntl.h>

#include <sys\stat.h>

int recv_file(SOCKET sock)

{

char buffer[1024] = {0}

int name_len

/*首先读取sizeof(int) 即4个字节的内容,服务器发送文件名之前会把该文件名的长度发送过来*/

if (recv(sock,(char *)&name_len,sizeof(int),0) <0)

{

printf("远程服务器断开")

return -1

}

/*接收即将悄笑传输文件的文件名*/

if (recv(sock,buffer,name_len,0))

{

printf("远程服务器断开")

return -1

}

/*创建该文件,最好此处加上判断,该文件是否已经存在*/

int fd = open(buffer,O_RDWR|O_CREAT ,S_IFMT )

if (fd <0)

{

printf("文件创建失败\n")

return -1

}

int recv_count = 0

/*从套接字循环读取文件内容*/

while ((recv_count = recv(sock,buffer,sizeof(1024),0))>0)

{

/*将读取到的内容保存至文件,recv_count为从网络上读取到得字节数,然后原数保存至文件*/

write(fd,buffer,recv_count)

}

printf("文件接收完成,成功保存至当前目录下\n")

return 0

}

void main()

{

WSADATA wsa_data

/*windows 下使用sock 必须调用这个函数,0x0202是一个版本号*/

WSAStartup(0x0202,&wsa_data) SOCKET s_sock

/*创建套接字*/

s_sock = socket(AF_INET,SOCK_STREAM,0)/*定义本机绑定套接字需要的IPV4地址*/

sockaddr_in se_addr

se_addr.sin_family = AF_INET

se_addr.sin_port = htons(1024)/*指定端口号1024*/

se_addr.sin_addr.S_un.S_addr = INADDR_ANY/*绑定本机任意网卡IP*/ /*将前两步创建的套接字和IP地址绑定*/

bind(s_sock,(sockaddr*)&se_addr,sizeof(sockaddr))/*开始启动监中悔听服务*/

if (listen(s_sock,10)<0)

{

int err = GetLastError()

}

sockaddr_in from_addr

int addr_len = sizeof(from_addr)

/*等待发送文件服务器连接,此为阻塞函数*/

SOCKET temp_sock = accept(s_sock,(sockaddr *)&from_addr,&addr_len)/*有服务器连接到本机,调用接收文件函数*/

recv_file(temp_sock)

} 文件发送端:#pragma comment(lib,"ws2_32.lib")#include <stdio.h>

#include <io.h>

#include <winsock2.h>

#include <fcntl.h>

#include <sys\stat.h>

int send_file(SOCKET sock,char *name)

{

int fd = open(name,O_RDWR ,S_IFMT )

if (fd <0)

{

printf("文件打开失败\n")

return -1

} int name_len = strlen(name)

/*首先发送文件名的长度*/

send(sock,(char *)&name_len,sizeof(int),0)

/*发送文件名*/

send(sock,name,name_len,0)

char buffer[1024] = {0}

int read_count = 0

/*循环从文件中读取,然后写入到套接字,发送到网络*/

while ((read_count = read(fd,buffer,sizeof(1024)))>0)

{

send(sock,buffer,read_count,0)

}

printf("文件发送完成\n")

return 0

}

void main(int argc,char *argv[])

{

WSADATA wsa_data

WSAStartup(0x0202,&wsa_data)

SOCKET s_sock

s_sock = socket(AF_INET,SOCK_STREAM,0)

sockaddr_in to_addr

to_addr.sin_family = AF_INET

to_addr.sin_port = htons(1024)

/*指定接收文件IP为本机(127.0.0.1为本机IP),如其他主机请更改此IP,正常来说,IP应写入配置文件*/

to_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1")

char file_name[256] = {0}

printf("请输入要发送的文件名,并确保该文件存在于当前目录下\n")

scanf("%s",file_name)/*连接接收文件的电脑*/

if (connect(s_sock,(sockaddr *)&to_addr,sizeof(sockaddr)) <0)

{

printf("链接接受文件电脑失败\n")

return

} /*调用发送文件函数*/

send_file(s_sock,file_name)

}

多文件之间,一般很少有单个参数传递,那个交集太大,不容易移植,各个文件之间最好是越独立越好。你提到的数据传递,一般是通过函数接口来实现的。就是说我要用另一个C文件中的某一个功烂渣能的时候,可以通过include它的头文毁历困件,然后直接调用它的接口函数,这样目的就达到了,这样实现的好处就是易于移植。这个概念是很重要的,这样好些函数,你写完一遍之后就是一劳永逸啦,纤念大家都知道C的移植性很好嘛。明白了吗?

希望这个回答能对你有帮助哈~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8172187.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存