我可以关闭并重新打开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。