我可以关闭并重新打开sockets吗?

我学习了套接字使用的一个例子。 在此示例中,客户端向服务器发送请求以打开套接字然后服务器(侦听特定端口)打开套接字并且一切正常,套接字从双方(客户端和服务器)“打开”。

但我仍然不清楚这些东西有多灵活。 例如,客户端是否可以关闭打开的(从两端)套接字并再次重新打开它(在服务器保持套接字打开的情况下)。

服务器是否可以“知道”客户端上的套接字已关闭? 客户端是否可以知道服务器端的套接字已关闭?

添加:

对我来说更重要的一件事。 如果应用程序(无主服务器或客户端)崩溃,exception终止,被杀,会发生什么? 它会关闭应用程序侧面打开的所有套接字吗?

增加2:

如果套接字一侧的应用程序被关闭(终止,关闭,终止)然后再次打开(在相同的IP地址和相同的端口上),该怎么办? 我们应该在两个应用程序之间创建一个新套接字,还是可以使用旧套接字(在崩溃之前创建)。

服务器是否可以“知道”客户端上的套接字已关闭?

当服务器尝试向该客户端发送一些数据时,将抛出相应的exception。

对我来说更重要的一件事。 如果应用程序(无主服务器或客户端)崩溃,exception终止,被杀,会发生什么? 它会关闭应用程序侧面打开的所有套接字吗?

为处理这些exception情况创建了例外。 如果出现黑屏并关闭客户端(或服务器),则一旦尝试与关闭端进行交互,其他方将获得exception。

UPD:

如果套接字一侧的应用程序被关闭(终止,关闭,终止)然后再次打开(在相同的IP地址和相同的端口上),该怎么办? 我们应该在两个应用程序之间创建一个新套接字,还是可以使用旧套接字(在崩溃之前创建)。

创建新套接字。

套接字可以用于许多事情,这些问题的答案会改变,但我会假设你在谈论TCP。

例如,客户端是否可以关闭打开的(从两端)套接字并再次重新打开它(在服务器保持套接字打开的情况下)。

不,因为TCP将执行再见而您无法再从那里获取连接。 您必须再次进行三次握手,这将启动一个全新的连接。

服务器是否可以“知道”客户端上的套接字已关闭? 客户端是否可以知道服务器端的套接字已关闭?

是的 TCP可以发送一个再见包,或者一方可以超时,在这两种情况下完全可以检测到这些情况。

Q1->服务器是否可以“知道”套接字在客户端关闭? 客户端是否可以知道服务器端的套接字已关闭?

A1 – >服务器将知道,如果客户端关闭套接字,反之亦然。 实际上FIN将从最后发送,这将启动关闭连接。

Q2->如果sockets一侧的应用程序关闭(终止,关闭,终止),然后再次打开(在同一IP地址和同一端口上),该怎么办? 我们应该在两个应用程序之间创建一个新套接字,还是可以使用旧套接字(在崩溃之前创建)。

A2->如果创建了socket,fd number与ip-addr&port绑定,所以服务器端的socket有server-ip,客户端的某个端口和socket有client-ip和某个端口。 如果崩溃发生在客户端,则所有fd都被释放,并且无法重复使用。如果我们使用相同的fd,系统会将其视为普通文件fd。