同时读取和在C或C在同一插座上写++(simultaneously read and write o

2019-08-01 18:50发布

我采取一个简单的服务器,接受单个连接,然后使用该套接字同时读写从读邮件,写线程。 什么是同时读取和在Linux下C / C ++相同的socket描述符编写安全,简便的方法? 我不需要担心多线程读取并从同一个插座写作一样会有一个专用的读取和一个专用的写线程写入插座。

在上述情况下,是任何一种锁定需要的?

是否出现上述情况需要非阻塞插座?

是否有任何开源库,这将有助于在出现上述情况?

Answer 1:

在上述情况下,是任何一种锁定需要的?

没有。

是否出现上述情况需要非阻塞插座?

读和已建立的连接上写线程 - - 你可能担心的一点,如果你很高兴这些线程的坐在那里等待完成不需要无阻塞。 这是正常的,你会使用线程,而不是选择或投票或异步操作的原因之一......使得代码更简单了。

如果线程接受新的客户很高兴在调用块来accept()那么你所有的好也有。

不过,有一个与你可能要保持在你的脑海里TCP服务器的一个微妙的问题......如果你的程序的增长来处理多个客户端,并具有一定的周期性的看家做。 这是自然的和诱人的使用select语句超时检查监听套接字上的可读性-这表示客户端的连接尝试-然后accept连接。 有一个竞争条件有:客户端连接尝试之间可能有所下降select()accept() ,在这种情况下accept()如果监听套接字不是无阻塞将阻止,并能防止及时归还到select()循环,直到另一个客户端连接暂停定期对超时处理。

是否有任何开源库,这将有助于在出现上述情况?

有数以百计的类库来编写基本的服务器,但你问最终什么容易顶上OS提供的BSD套接字或他们的Windows bastardisation实现。



Answer 2:

套接字是双向的。 如果曾经实际解剖以太网或串行电缆或看到他们的低层硬件接线图,你可以看到为“TX”(发送)不同的铜线和“RX”(接收)线。 用于发送信号,从设备控制达到最OS API的一个“窝”的软件,反映了这个,这是一个插座,在大多数系统上(如Linux)的普通管之间的关键区别。

要真正获得最大的插座,您需要:
1)使用IO完成端口异步IO支持,epoll的()或一些相似的异步回调或事件系统到“唤醒”,每当数据来自在插座上。 这则必须打电话给你的最低级别的“READDATA” API来阅读邮件关闭套接字连接。
2)支持低级别甲第二API写道,推字节到插座和不依赖于任何的“READDATA”逻辑需求的“写数据”(发送)。 记住,你的发送和接收是独立的,甚至在硬件层面,所以不会引入在这个级别锁定或其他同步。
3)套筒IO线程,其盲目地做到这一点,从读取或将被写入到一个套接字数据的任何处理池。
4)协议回调:一个回调对象套接字线程,拥有智能指针。 它可以处理任何协议层 - 例如解析您的数据blob成的基本套接字连接上面的一个真正的HTTP请求 - 。 请记住,一个插座是送过来它通常会到达一系列fragments-数据包的计算机和数据之间只是一个数据管道。 在类似UDP协议的数据包甚至不是​​为了。 低层次的“READDATA”和“写数据”从它们的线程回调到这里,因为它是内容感知数据处理实际开始。
5)任何回调本身需要的协议处理程序。 对于HTTP,打包原始请求缓冲区到您移交给一个真正的servlet,它应该会返回一个可序列化到一个HTTP符合规范的响应一个很好的响应对象不错的对象。

注意基本模式:你必须使整个系统从根本上异步如果你想采取的双向充分利用,异步IO通过套接字(一个“回调的洋葱”)。 只有这样,才能读取和插座是线程同时写,所以你仍然可以一个“作家”和“读者”线程之间同步,但如果协议或其他因素迫使我的手,我只做到这一点。 好消息是,你可以使用高度异步处理得与插座强大的性能,坏的是,在一个强大的方式建立这样一个系统是一个很大的努力。



Answer 3:

你不必担心它。 像您期望的一个线程读,一个线程写入会工作。 套接字是全双工的,所以当你写的,反之亦然,你可以阅读。 你不得不担心,如果你有多个作家,但事实并非如此。



文章来源: simultaneously read and write on the same socket in C or C++