- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
首先,解释一下动机的一些背景知识:我正在研究一个非常简单的基于 select() 的 TCP“镜像代理”,它允许两个受防火墙保护的客户端间接地相互交谈。两个客户端都连接到此服务器,一旦两个客户端都连接上,客户端 A 发送到服务器的任何 TCP 字节都会转发到客户端 B,反之亦然。
这或多或少是可行的,但有一个小问题:如果客户端 A 连接到服务器并在客户端 B 连接之前开始发送数据,则服务器没有地方可以放置数据。我不想将它缓冲到 RAM 中,因为那样最终可能会占用大量 RAM;而且我也不想只删除数据,因为客户端 B 可能需要它。所以我选择了第三个选项,即在客户端 B 也已连接之前,不要在客户端 A 的套接字上选择 ()-for-read-ready。这样客户端 A 就会阻塞,直到一切准备就绪。
这或多或少也有效,但在客户端 A 的套接字上不选择读取就绪的副作用是,如果客户端 A 决定关闭他与服务器的 TCP 连接,服务器不会收到有关的通知这个事实 - 至少,直到客户端 B 出现并且服务器最终在客户端 A 的套接字上选择读取就绪,读取任何未决数据,然后获得套接字关闭通知(即 recv() 返回 0) .
如果服务器有某种方式(及时)知道客户端 A 何时关闭了他的 TCP 连接,我会更喜欢它。有办法知道吗?在这种情况下轮询是可以接受的(例如,如果存在这样的函数,我可以让 select() 每分钟唤醒一次并在所有套接字上调用 IsSocketStillConnected(sock))。
最佳答案
如果你想检查套接字是否真的关闭而不是数据,你可以在 recv()
上添加 MSG_PEEK
标志来查看数据是否到达或者你是否得到 0
或一个错误。
/* handle readable on A */
if (B_is_not_connected) {
char c;
ssize_t x = recv(A_sock, &c, 1, MSG_PEEK);
if (x > 0) {
/* ...have data, leave it in socket buffer until B connects */
} else if (x == 0) {
/* ...handle FIN from A */
} else {
/* ...handle errors */
}
}
即使 A 在发送了一些数据后关闭,您的代理可能希望在将 FIN 转发给 B 之前先将该数据转发给 B,因此在读取之后就知道 A 已经在连接上发送了 FIN 是没有意义的它发送的所有数据。
直到双方都发送 FIN 之后,TCP 连接才会被视为关闭。但是,如果 A 强行关闭了它的端点,直到您尝试在其上发送数据并收到 EPIPE
(假设您已抑制 SIGPIPE
)后,您才会知道这一点.
在稍微阅读了您的镜像代理应用程序之后,由于这是一个防火墙穿越应用程序,您似乎实际上需要一个小型控制协议(protocol)来允许您验证这些对等点实际上是否被允许相互交谈。如果你有一个控制协议(protocol),那么你有很多可用的解决方案,但我提倡的是让一个连接将自己描述为服务器,另一个连接将自己描述为客户端。然后,如果不存在服务器来建立连接,您可以重置客户端的连接。您可以让服务器等待客户端连接直至超时。服务器不应启动任何数据,如果它在没有连接的客户端的情况下启动,您可以重置服务器连接。这消除了为死连接缓冲数据的问题。
关于c - 有没有办法检测到 TCP 套接字已被远程对等方关闭,而无需从中读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17705239/
我使用下拉菜单提供一些不同的链接,但我希望这些链接在同一选项卡中打开,而不是在新选项卡中打开。这是我找到的代码,但我对 Javascript 非常缺乏知识 var urlmenu = docume
我对 javascript 不太了解。但我需要一个垂直菜单上的下拉菜单,它是纯 JavaScript,所以我从 W3 复制/粘贴脚本:https://www.w3schools.com/howto/t
我已经坐了 4 个小时,试图让我的导航显示下 zipper 接垂直,但它继续水平显示它们。我无法弄清楚为什么会发生这种情况或如何解决它。 如果有人能告诉我我做错了什么,我将不胜感激。我有一个潜移默化的
我正在尝试创建选项卡式 Accordion 样式下拉菜单。我使用 jQuery 有一段时间了,但无法使事件状态达到 100%。 我很确定这是我搞砸的 JS。 $('.service-button').
对于那些从未访问过 Dropbox 的人,这里是链接 https://www.dropbox.com/ 查看“登录”的下拉菜单链接。我如何创建这样的下 zipper 接? 最佳答案 这是 fiddle
我正在制作一个 Liferay 主题,但我在尝试设计导航菜单的样式时遇到了很多麻烦。我已经为那些没有像这样下拉的人改变了导航链接上的经典主题悬停功能: .aui #navigation .nav li
如果您将鼠标悬停在 li 上,则会出现一个下拉菜单。如果您将指针向下移至悬停时出现的 ul,我希望链接仍然带有下划线,直到您将箭头从 ul 或链接移开。这样你就知道当菜单下拉时你悬停在哪个菜单上。 知
我有一个带有多个下拉菜单的导航栏。因此,当我单击第一个链接时,它会打开下拉菜单,但是当我单击第二个链接时,第一个下拉菜单不会关闭。 (所以如果用户点击第二个链接我想关闭下拉菜单) // main.js
我正在尝试制作一个导航下拉菜单(使用 Bootstrap 3),其中链接文本在同一行上有多个不同的对齐方式。 在下面的代码中,下拉列表 A 中的链接在 HTML 中有空格字符来对齐它们,但是空白被忽略
我希望有人能帮我解决这个 Bootstrap 问题,因为我很困惑。 有人要求我在底部垂直对齐图像和其中包含图像的链接。 我面临的问题是他们还希望链接在链接/图像组合上具有 pull-right,这会杀
我正在构建一个 Rails 应用程序,并希望指向我的类的每个实例的“显示”页面的链接显示在“索引”页面的下拉列表中。我目前正在使用带有 options_from_collection_for_sele
我有以下 Bootstrap3 导航菜单 ( fiddle here )。我想设置“突出显示”项及其子链接与下拉列表 1 和 2 链接不同的链接文本(和悬停)的样式。我还希望能够以不同于 Highli
我对导航栏中的下拉菜单有疑问。对于普通的导航链接(无下拉菜单),我将菜单文本放在 H3 中,但是当我尝试对下 zipper 接执行相同操作时,箭头不在标题旁边,而是在标题下方。我决定用 span 替换
我是一名优秀的程序员,十分优秀!