问题如上,在论坛上查了,好像也没被解决!我也是遇到了这个问题,简单写了一个程序测试,如下,该释放也释放了,该允许重复利用端口也允许了,但是就是没解决!求CSDN高手! TcpClient client;
const int portNO = 60000;
const int localport = 2290; private void button1_Click(object sender, EventArgs e)
{
if (client != null)
{
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
//client.Close();
//socketListen.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); }
//else
//{
IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, localport);
client = new TcpClient(ipLocalEndPoint);
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
client.Connect("127.0.0.1", portNO);
string msg = "LOGEIN";
byte[] buffer = System.Text.Encoding.Default.GetBytes(msg);
int i = client.Client.Send(buffer);
Console.ReadLine();
//}
} private void button2_Click(object sender, EventArgs e)
{
client.Client.Disconnect(true);
//client.Dispose();
client.Close();
}
const int portNO = 60000;
const int localport = 2290; private void button1_Click(object sender, EventArgs e)
{
if (client != null)
{
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
//client.Close();
//socketListen.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); }
//else
//{
IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, localport);
client = new TcpClient(ipLocalEndPoint);
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
client.Connect("127.0.0.1", portNO);
string msg = "LOGEIN";
byte[] buffer = System.Text.Encoding.Default.GetBytes(msg);
int i = client.Client.Send(buffer);
Console.ReadLine();
//}
} private void button2_Click(object sender, EventArgs e)
{
client.Client.Disconnect(true);
//client.Dispose();
client.Close();
}
既然调用close能释放所有资源,不明白为什么还是会报错呢!?~
{ IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, localport);
client = new TcpClient(ipLocalEndPoint);
client.Connect("127.0.0.1", portNO);
string msg = "LOGEIN";
byte[] buffer = System.Text.Encoding.Default.GetBytes(msg);
int i = client.Client.Send(buffer);
Console.ReadLine();
}
catch (Exception we)
{
Console.WriteLine(we.ToString());
}button2的代码改为如下: //client.Client.Disconnect(true); client.Client.Shutdown(SocketShutdown.Both);使用shutdown是可以断开与服务器的连接,但是再次点击button1,重连时仍然会报错!
Socket socket2 = listener.Accept();
socket2.Disconnect(true);
Console.WriteLine(socket2.RemoteEndPoint.ToString());
socket2.Close();
服务器这时会阻止在socket2.Disconnect(true);这里在客户端点击button2.也就是调用
client.Client.Shutdown(SocketShutdown.Both);
再用button1重连,是可以连上的!而且不报错!
看来要么改注册表,要么换端口了!