简单文件传输
来源:互联网 发布:软件模拟陀螺仪 编辑:程序博客网 时间:2024/04/19 09:08
-----原理:
文件传输的原理其实很简单,服务端先在某个端口监听,等待客户端的连接,连接成功后,服务端打开指定的文件,然后读取文件,再通过创建的套接字发送给客户端。如果要实现一个服务端能与多个客户端连接,则需要用到多线程,下面给出一对一的实现代码,有兴趣的朋友可以用多线程实现一对多。
-----程序代码:
- //fileserver.cc
- #include <iostream>
- #include <stdio.h>
- #include <strings.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <netinet/in.h>
- using namespace std;
- //./fileserver 2000 hahaya.txt 其中2000为端口号,hahaya.txt为文件名
- int main(int argc, char *argv[])
- {
- int sk = socket(AF_INET, SOCK_STREAM, 0);
- if(sk == -1)
- {
- cout << "create socket failed..." << endl;
- return 0;
- }
- struct sockaddr_in serveraddr;
- bzero(&serveraddr, sizeof(serveraddr));
- serveraddr.sin_family = AF_INET;
- serveraddr.sin_port = htons(atoi(argv[1]));
- serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
- if(bind(sk, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) != 0)
- {
- cout << "bind failed..." << endl;
- close(sk);
- return 0;
- }
- listen(sk, 5);
- struct sockaddr_in clientaddr;
- bzero(&clientaddr, sizeof(clientaddr));
- size_t len = sizeof(clientaddr);
- int talk = accept(sk, (struct sockaddr*)&clientaddr, &len);
- //打开文件并准备发送
- cout << "server ready..." << endl;
- FILE *fp = fopen(argv[2], "r+");
- int size = 0;
- char buff[1024] = {'\0'};
- while((size = fread(buff, 1, sizeof(buff), fp)) > 0)
- {
- cout << "file sending..." << endl;
- send(talk, buff, size, 0);
- }
- cout << "send success..." << endl;
- fclose(fp);
- close(talk);
- close(sk);
- return 0;
- }
- //fileclient.cc
- #include <iostream>
- #include <stdio.h>
- #include <stdlib.h>
- #include <strings.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <netinet/in.h>
- using namespace std;
- //./clientserver 192.168.0.1 2000 hahaya.txt
- int main(int argc, char *argv[])
- {
- int sk = socket(AF_INET, SOCK_STREAM, 0);
- if(sk == -1)
- {
- cout << "create socket failed..." << endl;
- return 0;
- }
- struct sockaddr_in serveraddr;
- bzero(&serveraddr, sizeof(serveraddr));
- serveraddr.sin_family = AF_INET;
- serveraddr.sin_port = htons(atoi(argv[2]));
- serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
- connect(sk, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
- FILE *fp = fopen(argv[3], "w+");
- char buff[1024] = {'\0'};
- int len = 0;
- cout << "begin recv..." << endl;
- while((len = recv(sk, buff, sizeof(buff), 0)) > 0)
- {
- cout << "file recv..." << endl;
- fwrite(buff, 1, len, fp);
- }
- cout << "file success..." << endl;
- close(sk);
- fclose(fp);
- return 0;
- }
-----程序运行:
开启服务端: ./fileserver 2000 ./eclipse.zip
开启客户端: ./fileclient 192.168.254.128 2000 ./test.zip
这样就把eclipse.zip传到客户端了
- 简单文件传输
- 简单文件传输
- TFTP(简单文件传输协议)
- TFTP 简单文件传输协议
- socket简单文件传输实例
- JavaFTP文件传输 简单实现
- 简单文件传输程序的实现
- c# p2p 文件传输 简单实例
- socket实现简单文件传输系统
- 文件传输
- 文件传输
- 文件传输
- 文件传输
- 文件传输
- 文件传输
- 文件传输
- 文件传输
- 用socket实现简单的文件传输
- 阻塞队列
- CSDN论坛RSS阅读,平板电脑专用
- InputManager 哈哈要的就是你!
- javascript 获取滚动条高度+常用js页面宽度与高度[转]
- 左中右布局, 可以拖动的中间块
- 简单文件传输
- 项目小结
- 国外程序员推荐:每个程序员都应读的书
- 交叉编译Apache+PHP+MySQL
- 腾讯70亿元投资拼图 企鹅帝国“慢”之谜
- #pragma预处理指令
- postgre中类型转换
- PVFS2 的 Linux Kernel 模块编译
- Android获取内部和外部内存空间大小