【问题标题】:What's the better way: 1 pipe and 1 socket, or 1 socket?更好的方法是:1 个管道和 1 个插座,还是 1 个插座?
【发布时间】:2013-05-01 10:21:24
【问题描述】:

我有一个服务器程序,它处理音频数据并将其传递给音频驱动程序。

服务器程序复制音频数据并在一个秒线程中将副本放入一个命名的 FIFO。

如果 FIFO 的另一端没有客户端读取也没关系,因为它只是阻塞了 FIFO 线程。

现在我想添加一个“控制”功能,例如“增加音量、加快播放速度等”。因此最终连接的客户端可以控制服务器程序。

重要的是:如果客户端最终断开连接(通过 close() 或中止),服务器已经检测到这一点,应该回到正常模式并忘记来自客户端的所有命令。

直到现在我还没有使用过套接字,所以我不确定最好的方法是什么:

  1. 按原样使用来自服务器->客户端的 FIFO,并添加一个仅用于客户端->服务器通信的套接字?

  2. 使用一个套接字流式传输服务器->客户端并从客户端->服务器发出命令(以字节格式?)

我会使用“AF_UNIX, SOCK_STREAM”作为套接字。 #2 是更好的变体吗?以及如何确定客户端是否在没有 close() 的情况下断开连接?

【问题讨论】:

  • 使用多个连接来做不同的事情并不少见,例如 FTP。但是,如果协议允许,您也可以使用相同的连接来做不同的事情。

标签: c sockets stream two-way


【解决方案1】:

我投票选择 nr.2,一个可能的解决方案是:

1-创建套接字[sock_stream....];

2-fork()[继承套接字描述符];

-father[use to read];
-son[use to write];

当从套接字描述符的 read() 返回 0bytes 时,您可以实现检测客户端断开连接

【讨论】:

  • 好的,客户端也这样做,是吗?一个线程/分叉接收数据,另一个线程最终写入命令?你知道如何确定客户端是否在没有适当关闭的情况下退出吗?
  • 是的,因此它可以在两者上都是双向的,并且可以确定,因为当读取(来自 sock fd)返回 0 字节时意味着另一端已关闭,也就是断开连接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2015-04-23
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多