我可以通过端口号关闭套接字吗?

时间:2013-03-28 14:15:56

标签: sockets junit port

我正在测试一个简单的客户端/服务器应用程序。我在客户端进行的单元测试需要服务器,但我似乎要挂起(个别测试工作,但不超过一个)。

作为我的tearDown()的一部分,我认为关闭服务器套接字会很好,但是......因为我无法访问服务器对象,从客户端代码,我不能做一个简单的:serverSocket.close()。也就是说,我确实知道套接字正在运行什么端口号,仅使用端口号,是否可以关闭套接字,无论使用它的对象驻留在何处/如何驻留?

对不起,这可能是一个微不足道的问题......谢谢......

我想另一个相关问题是......我可以根据已经使用的端口号创建套接字吗?

2 个答案:

答案 0 :(得分:0)

没有。您需要让服务器软件关闭端口。

唯一的另一种方法是终止服务器:您可以使用lsof或netstat识别端口打开的进程,然后终止该进程。这是一个释放港口的野蛮方式。在你的情况下,你最好修理软件而不是挂起!

答案 1 :(得分:0)

如果套接字在您的进程中,您可以做的是遍历从0到getrlimit(RLIMIT_NOFILE)的所有文件描述符,并在每个文件描述符上调用getsockname()。如果呼叫成功并且端口号匹配,则您已通过端口号找到您的套接字(请注意,可能是具有相同端口号但绑定到不同地址的多个套接字)。