- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设通过网络在两个套接字之间建立了 tcp 连接。 一个是服务器,另一个是客户端。
当客户端宕机时会发生什么?从套接字编程的角度来看。假设我们为此编写了自己的套接字程序。
TCP 堆栈中发生了什么?
谁来处理这些情况?无论是 TCP 栈还是 Socket 程序都要有自己的智能?
如果重复,请将我指向线程。
最佳答案
What happen when client is down ? from socket programming perspective. Assume that we have written our own socket program for this.
“客户端已关闭”,我假设您的意思是“有人将客户端计算机的以太网线从墙上拉了出来”,即客户端计算机突然完全失去了与服务器的通信(而不是“客户端程序崩溃/退出”,这是一种不同且更简单的情况,因为在这种情况下,客户端计算机的操作系统仍然可以向服务器解释发生了什么)
在这种情况下,服务器将停止接收来自客户端的任何数据包。这意味着它不会再收到客户端发送的任何数据(很明显),但这也意味着服务器也不会收到任何返回的 ACK 数据包以响应它发送给客户端的数据。
从套接字编程的角度来看,假设服务器正在尝试向客户端发送数据,套接字的传出数据缓冲区将填满数据,此时服务器将无法写入()/发送( ) 任何更多数据到该套接字。也就是说,如果套接字处于阻塞模式,下一次对 write()/send() 的调用将阻塞,或者如果套接字处于非阻塞模式,调用将立即出错并返回 errno EWOULDBLOCK。该状态通常会持续一段时间(例如 30 秒到几分钟),直到服务器的 TCP 协议(protocol)逻辑最终厌倦了无结果地重新发送数据包并放弃客户端的响应;此时服务器的 TCP 堆栈将单方面关闭连接。发生这种情况时,对套接字上的 send() 或 write() 的任何调用都会导致发出 SIGPIPE 信号(如果您没有安装信号处理程序,可能会中止服务器程序),或者如果您已经完成信号(SIGPIPE,SIG_IGN),然后 write()/send() 调用将只返回 -1 并将 errno 设置为 EPIPE。
另一方面,如果服务器没有尝试向客户端发送任何数据,则服务器无法知道客户端已经离开,在这种情况下可能需要几个小时(或永远不会,取决于您是否在套接字上启用了 TCP keepalive)在服务器执行任何操作之前。 (这就是为什么许多基于 TCP 的程序会定期通过空闲的 TCP 套接字发送虚拟数据,这样它们就会尽早发现连接已经消失)
What happen in TCP stack ?
在 TCP 堆栈内部有逻辑(从概念上讲)监视系统中每个 TCP 套接字的传出数据缓冲区,只要套接字缓冲区中存在数据字节,TCP 堆栈就会尝试获取该数据传送到远程主机。它通过发送 TCP 数据包来做到这一点,如果它没有从远程对等点获得这些数据包已收到的确认,稍后它将尝试再次发送它们。由于继续收不到确认,每次重试等待的时间会越来越长,和/或降低数据包的发送速率,以期减少网络拥塞足以让一些数据通过(记住服务器已经无法知道为什么客户端没有响应)。最终它会决定继续没有意义,然后它会放弃并关闭 TCP 连接。
Who will handle these situation ? Either TCP stack or Socket program has to have its own intelligence ?
两层都必须处理它。 TCP 堆栈的发送更多 TCP 数据例程处理死套接字的检测,并将该情况传达给套接字程序(如上所述),然后由套接字程序优雅地处理死连接(通常通过 close()-ing 损坏的 TCP 套接字并在没有它的情况下继续。
关于Linux Socket编程 : what happen in server socket when client socket gone off in the middle of communication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40146833/
我最近从 mysql_ 切换到 PDO,这真的很痛苦。一切看起来都那么复杂。 过去我开发了一个系统,用户可以导入包含记录的 csv。然后通过 while 循环将这些行导入数据库。它在 mysql_qu
android 布局使用 layout_weight。我的目标是所有组件的 1/3,但有时页脚实际上设置为消失,然后可见。从 gone 设置为 visible 时,权重计算如何工作?我没有看到具有 1
我想要一个小的“标题”,当我单击它时,其余内容会使用向上滑动动画显示。 我已经尝试了一些动画,但我唯一想做的就是在其父级中为内容设置动画。我想要的是,当我单击标题时,整个标题和内容(具有可见性 GON
我使用 Firebase 和 RadioButton 获得 2 种类型的数据,我对显示的数据进行排序。一切似乎都正常,但是当隐藏其中一种数据类型时仍然有一个空白空间。告诉我如何正确隐藏/显示数据。 T
我的 Jersey API 如下: @DELETE @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON
在 VBA Excel 中,如果我在关闭并再次打开文件后使用 UserInterFaceOnly:=True 选项保护工作表,则 UserInterFaceOnly 模式不会激活,只有密码保护。 代码
如果设备设置为英国英语,我不想显示布局。最好的方法是什么?每次获取设备语言? 最佳答案 往这边走,GB代表大不列颠(英国) String locale = context.getResources()
我的布局中有来自设计支持库的 FAB: //....
当我尝试在 Eclipse 中使用图形布局界面(而不是 xml)进行布局时,我遇到了这个问题: 假设我的主要布局只是屏幕底部的一个简单按钮,单击该按钮时,会打开一个覆盖大部分屏幕的文本框。 注意:我这
在我的应用程序中,我有 RelativeLayout 和任何小部件,进入布局,我想通过 xml 动画将其向上移动。 RelativeLayout 可见性为 GONE 并且必须再次将可见性设置为 GON
我的 XMl 中有这段代码。由于某种原因, View 仍然可见。我还有其他 block 可以使其在特定时间点可见,但我已经将它们注释掉了。这是保留此 View 的最后一段代码,出于某种原因我仍然可以看
我有一个包含一个 TextView 和两个图像的相对布局(宽度固定宽度,高度 = 48dip)。当我为一张图片设置 visibility view.gone 时,它不会释放空间 最佳答案
所以我有一个应用程序,当用户点击 button 时,将为带按钮的 layout 执行 animation(例如 滑动菜单),然后如果他点击另一个按钮,它必须使第一个布局不可见或消失,然后是新布局。 但
我想问一下,如何为 Admob 实现 AdListner。我希望广告在点击后消失。我试过了,但没有用。 final AdView ad1 = (AdView) findViewById(R.id.ad
我想将一个 View 设置为 GONE,然后让其他 View 占用剩余空间。 现在,如果我将它设置为 GONE,它会在布局中原来的位置留下一个空间,该 View 是一个具有固定高度的 viewpage
pypi.python.org has been migrated to pypi.org之后,我在尝试像往常一样使用命令将包上传到 PyPI 时遇到错误: python2.7 setup.py sd
我有一个自定义搜索面板,它是主布局的一部分。大多数时候面板是隐藏的。我想在面板上添加出现/消失的动画。这是简化的布局摘录: > > 尝
我遇到了一个问题,即可见性状态为 GONE 的 View (不希望地)占用了屏幕空间。这个问题总是发生在 API 级别 <= 7 的设备上,但最近才发生在 8+ 设备上(在我使用 AsyncTasks
所以我的应用程序中有一个 GLSurfaceView,由 GLSurfaceView.Renderer 渲染并使用 JPCt 作为库。 表面处于不可见的 RelativeLayout 中(可见性:消失
我有一个巨大的 XML 布局,其中有许多 Relative/Linear 布局,我现在正在做的是使用 setVisibility (View. GONE) 并在需要时更改其可见性。 我的问题是:这种方
我是一名优秀的程序员,十分优秀!