// 从服务器端接收数据到buffer中
bzero(buffer, sizeof(buffer));
int length = 0;
while(length = recv(client_socket, buffer, BUFFER_SIZE, 0))
{
if (length < 0)
{
printf("Recieve Data From Server %s Failed!\n", argv );
break;
}
int write_length = fwrite(buffer, sizeof(char), length, fp);
if (write_length < length)
{
printf("File:\t%s Write Failed!\n", file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}
printf("Recieve File:\t %s From Server[%s] Finished!\n", file_name, argv );
// 传输完毕,关闭socket
fclose(fp);
close(client_socket);
return 0;
}
2.使用现有的通讯中间件
2.1 ActiveMQ 传送文件接口
为了解决传输大文件的问题,ActiveMQ在jms规范之外引入了jms streams的概念。PTP模式下,连到同一个destination的两端,可以通过broker中转来传输大文件。
发送端使用connection.createOutputStream打开一个输出流,往流里写文件。
OutputStream out =connection.createOutputStream(destination);
接收端则简单的使用connection.createInputStream拿到一个输入流,从中读取文件数据即可。
InputStream in = connection.createInputStream(destination)
2.2 ZeroMQ 接口
ZeroMQ没有直接提供传送文件的接口。但ZeroMQ中send(void * data, size_t len)接口已经做好了封装,可以send任意大小的数据。代码如下:
zmq::context_t ctx(1);
zmq::socket_t sock(ctx, ZMQ_REQ);
sock.connect("tcp://192.168.20.111:20310");
sock.send(pData,len);//数据大小没有限制,可以直接发送任意大小的数据
char reply[100];
sock.recv (reply,100);
sock.disconnect(addr);
接收端代码如下:
m_context = new zmq::context_t(1);
m_socket = new zmq::socket_t (*m_context, ZMQ_REP);
m_socket->bind ("tcp://*:20310");
zmq::message_t request;
// Wait for next request from client
m_socket->recv (&request) // request可以接受发送来的任意大小的数据
m_socket->send("ok",2);
是不是很简单呢
3.基于共享文件、ftp、scp等
这就不细说了。要么就是写共享目录,要么就是调用系统命令。
4.总结
1)直接基于socket编程难度较高,所以不推荐。
2)使用现有的库方便,但需要学习。一般推荐。
3)共享文件、ftp、scp等难度低,简单易用,在符合使用场景时是首选。(但一些自命不凡的程序员或许会对你嗤之以鼻,考虑之...)