. net套接字连接问题-每个套接字地址通常只允许使用一次
本文关键字:套接字 许使用 一次 问题 连接 net 地址 | 更新日期: 2023-09-27 18:03:39
我有以下问题:
一旦我关闭我的WM6应用程序,然后尝试再次启动它,我得到这个错误:每个套接字地址(协议/网络地址/端口)通常只允许在System.Net.Sockets.Socket上使用一次。Bind(端点localEP)在System.Net.Sockets.Socket.TcpListener.Start ()…
我认为这是由于连接超时的时间间隔,所以我想关闭所有打开的连接,并强制它创建一个新的连接,这是正确的方式继续或有不同的方式来处理这个?
下面是用来开始监听的代码:
/// <summary>
/// Listens Asynchronously to Clients, creates a recieveMessageHandler to process the read.
///
/// Check WIKI, TODOS
/// </summary>
/// <returns></returns>
public void Listen()
{
myTcpListener.Start();
while (true)
{
//blocks until a client has connected to the server
try
{
TcpClient myTcpClient = myTcpListener.AcceptTcpClient();
DateTime now = DateTime.Now;
//Test if it's necessary to create a client
ClientConnection client = new ClientConnection(myTcpClient, new byte[myTcpClient.ReceiveBufferSize]);
// Capture the specific client and pass it to the receive handler
client.NetworkStream.BeginRead(client.Data, 0, myTcpClient.ReceiveBufferSize, r => receiveMessageHandler(r, client), null);
}
catch (Exception excp)
{
Debug.WriteLine(excp.ToString());
}
}
}
是的,您的服务器套接字可能处于TIME_WAIT状态。
您可以访问底层ServerSocket,然后使用SetSocketOption并指定ReuseAddress。
我猜这里ClientConnection
是您的DLL,因为我没有看到它已经包含在CF中。
如果你声明了MethodInvoker,你就不需要这么做了。
public delegate void MethodInvoker(); // required
为了让你的代码更流畅,你还应该创建你自己的EventArgs类:
public class WmTcpEventArgs : EventArgs {
private string data;
public WmTcpEventArgs(string text) {
data = text;
}
public string Data { get { return data; } }
}
非常简单。使用这个新的WmTcpEventArgs类和,您应该设置好接收可以发送到类似TextBox控件的数据:
private void NetworkResponder(object sender, WmTcpEventArgs e) {
textBox1.Text = e.Data;
}
与其在代码中编写while(true)
,我更喜欢包含一个小布尔变量
private bool abortListener;
代码看起来像这样:
public void Listen() {
listener.Start();
while (!abortListener) {
try {
using (var client = listener.AcceptTcpClient()) {
int MAX = client.ReceiveBufferSize;
var now = DateTime.Now;
using (var stream = client.GetStream()) {
Byte[] buffer = new Byte[MAX];
int len = stream.Read(buffer, 0, MAX);
if (0 < len) {
string data = Encoding.UTF8.GetString(buffer, 0, len);
MethodInvoker method = delegate { NetworkResponder(this, new WmTcpEventArgs(data)); };
abortListener = ((form1 == null) || form1.IsDisposed);
if (!abortListener) {
form1.Invoke(method);
}
}
}
}
} catch (Exception err) {
Debug.WriteLine(err.Message);
} finally {
listener.Stop();
}
}
}
注意,您仍然在捕获异常,但是您也停止了TcpListener。