解除 C#/Python 中的套接字连接

1 投票
1 回答
2429 浏览
提问于 2025-04-16 20:38

我手头有:

  • 两个用C#写的socket客户端程序。
  • 一个用Python写的socket服务器程序(不是我写的,但它能正常工作)。

问题是:

我写的第一个C# socket客户端运行得很好,能和Python服务器进行通信,数据发送没有问题。不过,我想把代码重写一下,让它更符合面向对象的编程,所以我写了第二个程序,功能和第一个是一样的。

但问题是,第二个程序无法连接,提示如下:

System.Net.Sockets.SocketException: 尝试以禁止的方式访问socket,权限不允许。

我在网上查了一下,发现第一个连接似乎没有完全解除绑定。

当我执行了 netstat -a 命令时,确实看到了这个连接,状态显示为TIME_WAIT。

我的问题是,怎么解除绑定?这个问题是在C#/客户端那边吗?

顺便说一下,我已经尝试过关闭/断开/关闭socket,但都没有效果。我还在创建socket连接时使用了这个命令:

connection.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

但也没有解决问题。

我需要在服务器那边做些什么来解除连接吗?

1 个回答

0

我知道你说你已经调用了关闭或断开连接的操作。

但是你有没有重新初始化那个套接字变量呢?

比如:connection = new System.Net.Sockets.Socket(...

如果你使用的是旧版本的 .Net,可能在调用 Close() 之后还需要调用 Dispose()。

比如:

connection.Close();
connection.Dispose();
connection = new System.Net.Sockets.Socket(...

一定要在 try 语句中处理套接字,因为任何发送和接收数据或关闭套接字的操作都有可能出错。如果出错了,你应该记录这个错误,然后调用 Close(),如果需要的话,再对套接字实例调用 Dispose() 来释放资源。完成这些后,你就可以重新初始化一个新的套接字实例,尝试重新连接到服务器。

撰写回答