我学习了套接字使用的一个例子。在此示例中,客户端向服务器发送请求以打开套接字,然后服务器(侦听特定端口)打开套接字,一切正常,套接字从双方(客户端和服务器)“打开”。
但我仍然不清楚这些东西有多灵活。例如,客户端是否可以关闭打开的(从两端)套接字并再次重新打开它(在服务器保持套接字打开的情况下)。
服务器是否可以“知道”客户端上的套接字已关闭?客户端是否可以知道服务器端的套接字已关闭?
增加:
对我来说更重要的一件事。如果应用程序(无主服务器或客户端)崩溃,异常终止,被杀,会发生什么?它会关闭应用程序侧面打开的所有套接字吗?
已添加2:
如果套接字一侧的应用程序被关闭(终止,关闭,终止),然后再次打开(在同一IP地址和同一端口上),该怎么办?我们应该在两个应用程序之间创建一个新套接字,还是可以使用旧套接字(在崩溃之前创建)。
答案 0 :(得分:9)
套接字可以用于很多事情,这些问题的答案会改变,但我会假设你在谈论TCP。
例如,客户端是否可以关闭已打开的(从两端)套接字并再次重新打开它(在服务器保持套接字打开的情况下)。
不,因为TCP将执行再见而您无法再从那里获取连接。您必须再次进行三次握手,这将启动一个全新的连接。
服务器是否可以“知道”客户端上的套接字已关闭?客户端是否可以知道服务器端的套接字已关闭?
Yes。 TCP可以发送一个再见包,或者一方可以超时,在这两种情况下完全可以检测到这些情况。
答案 1 :(得分:2)
服务器是否可以 “知道”套接字关闭了 客户方?
当服务器尝试向该客户端发送一些数据时,将抛出相应的异常。
对我来说更重要的一件事。什么 如果一个应用程序发生(没有 服务器或客户端)异常崩溃 终止,被杀?它会关闭所有 插座侧面打开 应用
为处理这些异常情况创建了例外。如果出现黑屏并关闭客户端(或服务器),则一旦尝试与关闭的一方进行交互,其他方将获得异常。
UPD:
如果申请单侧的申请怎么办? 插座已关闭(已杀死, 关闭,终止)然后是 再次打开(在相同的IP上 地址和相同的端口)。我们应该吗 在两者之间创建一个新的套接字 应用程序或我们可以使用旧的 socket(在崩溃之前创建)。
创建新套接字。
答案 2 :(得分:2)
Q1->服务器是否可以“知道”客户端上的套接字已关闭?客户端是否可以知道服务器端的套接字已关闭?
A1 - >如果客户端关闭套接字,则服务器将知道,反之亦然。实际上FIN将从最后发送,这将开始关闭连接。
Q2->如果套接字一侧的应用程序被关闭(终止,关闭,终止)然后再次打开(在相同的IP地址和相同的端口上),该怎么办?我们应该在两个应用程序之间创建一个新套接字,还是可以使用旧套接字(在崩溃之前创建)。
A2->如果创建了套接字,则fd number与ip-addr&端口,所以服务器端的socket有server-ip&客户端的一些端口和套接字有client-ip&一些港口。如果崩溃发生在客户端,则所有fd都被释放,并且无法重复使用。如果我们使用相同的fd,系统会将其视为普通文件fd。