C/C++大文件/数据网络传输方法总结
在C/C++网络编程中不免会遇到需要传输大数据、大文件的情况,而由于socket本身缓冲区的限制,大概一次只能发送4K左右的数据,所以在传输大数据时客户端就需要进行分包,在目的地重新组包。而实际上已有一些消息/通讯中间件对此进行了封装,提供了直接发送大数据/文件的接口;除此之外,利用共享目录,ftp,ssh等系统命令来实现大文件/数据也不失为一种好的方法。
1.基础的基于socket进行传输
基础的基于socket进行传输关键在于控制,需要自己行分包和组包。
data-cke-saved-src=http://www.2cto.com/uploadfile/Collfiles/20140117/20140117084908177.jpg
在C/C++网络编程中不免会遇到需要传输大数据、大文件的情况,而由于socket本身缓冲区的限制,大概一次只能发送4K左右的数据,所以在传输大数据时客户端就需要进行分包,在目的地重新组包。而实际上已有一些消息/通讯中间件对此进行了封装,提供了直接发送大数据/文件的接口;除此之外,利用共享目录,ftp,ssh等系统命令来实现大文件/数据也不失为一种好的方法。
1.基础的基于socket进行传输
基础的基于socket进行传输关键在于控制,需要自己行分包和组包。
data-cke-saved-src=http://www.2cto.com/uploadfile/Collfiles/20140117/20140117084908177.jpg
原理很简单那,我们就直接看一下代码吧。
服务器端的编写:
// file_server.c -- socket文件传输服务器端示例代码
// /
#include
#include
#include
#include
#include
#include
#define HELLO_WORLD_SERVER_PORT 6666 #define LENGTH_OF_LISTEN_QUEUE 20 #define BUFFER_SIZE 1024 #define FILE_NAME_MAX_SIZE 512 intmain(intargc, char**argv) { // set socket's address information // 设置一个socket地址结构server_addr,代表服务器internet的地址和端口 struct sockaddr_in server_addr; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htons(INADDR_ANY); server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); // create a stream socket // 创建用于internet的流协议(TCP)socket,用server_socket代表服务器向客户端提供服务的接口 intserver_socket = socket(PF_INET, SOCK_STREAM, 0); if(server_socket < 0) { printf(Create Socket Failed! ); exit(1); } // 把socket和socket地址结构绑定 if(bind(server_socket, (struct