Linux socket传送文件

ALLAN_ONLY 2010-03-18 02:09:16
Linux新手。我在Linux想实现文件的传送,不是字符串形式,而是完整的文件(通过二进制)。请问各位是怎么实现的呢,简单的框架和关键的代码(文件操作和send recv的调用)就行。
我写了一个,可能还不是特别正确,不过文件能传送,可是传送之后我看文件的属性比原来的文件大。可是文件并没有损坏,比如我传一个a.out应用程序仍然能运行。
...全文
180 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzhawsa 2010-06-02
  • 打赏
  • 举报
回复
说出来怎么解决的吧。
ALLAN_ONLY 2010-03-18
  • 打赏
  • 举报
回复
自己又弄了弄,行了,自己不懂的地方弄明白了。
谢谢各位关注。
ALLAN_ONLY 2010-03-18
  • 打赏
  • 举报
回复
大致有方向了,先看看。
lsldd 2010-03-18
  • 打赏
  • 举报
回复
对于很大的文件需要分包发送。
发包的时候,先发送固定大小的包头,包头标示包的类型和后续包体的大小,然后再发数据包。
这是收包方的代码。看完后你应该能想到如何设计发包方。

/************************************************************************/
/* desc: 接收数据包
/* packHead: 包头
/* packHead: 接受包的数据结构,包含包头。
/************************************************************************/
bool MySocket::RecvPacket( PacketHead& packHead, Packet& pack )
{
if ( packHead.length == 0)
return true;

int nRecvBytes = 0;
int ret;
memcpy(&pack, &packHead, HEADSIZE);// 把包头填充到接受包的最前端
while ( nRecvBytes < packHead.length)
{
if ( -1 == ( ret = recv(m_socket, (char*)(&pack)+HEADSIZE+nRecvBytes,
packHead.length-nRecvBytes, MSG_NOSIGNAL) ) )
{ // 失败
return false;
}
nRecvBytes += ret;
}
return ( nRecvBytes == packHead.length );
}
ALLAN_ONLY 2010-03-18
  • 打赏
  • 举报
回复
有一些例子我看过,是用read和write写的,把socket描述符当做文件来操作,可是我想用标准c实现文件的操作。
我是读到内存中的,只是一些细节问题希望有个明白的代码让我一看就知道,比如传送时候的边界,缓冲区大小等问题。
Wind_Runner 2010-03-18
  • 打赏
  • 举报
回复
楼主网上搜搜就很多的这样的例子的
冻结 2010-03-18
  • 打赏
  • 举报
回复
如果你传字符串会了。
你难道不能把文件读到内存,
然后当字符串传过去吗?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧