C# 如何防止socket重连接?

来源:百度知道 编辑:UC知道 时间:2024/06/21 22:56:44
怎样防止socket接受同一IP地址的重连接?
我写了一个异步侦听,用Web写了一个client,可是每点击一次连接就会在server及client出现一个连接,只是端口号不同,点击多少次就出现多少个连接,怎么才能防止这种情况发生? 请各位多多指点!
能否详细点?
listener = new TcpListener(ip[0], Port);
listener.Start();
while (isExit == false)
{
try
{
SocketDone.Reset();
AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);
listener.BeginAcceptTcpClient(callback, listener);
SocketDone.WaitOne();
}
catch (Exception err)
{ break; }
}

void AcceptTcpClientCallback(IAsyncResult ar)
{
try
{
SocketDone.Set();
TcpListener myListener = (TcpListener)ar.AsyncState;
client = myListener.EndAcceptTcpClient(ar);
.....
}
}

以上是我写的代码,该怎么改呢?

唉,跟我原来想的差不多,可是socket在这句就已经执行连接了:
TcpClient client = myListener.EndAcceptTcpClient(ar);

windows socket里,服务器端在侦听过程中,通过accept()函数的addr参数可以知道来连接的客户端的IP地址,设法记住这些已经连接的客户端的IP,再有新的连接时,查看是否已经有这个IP连接,如果有的话,拒绝连接就好了。

上面所说的方法,是直接利用winsock API编程时用的方法,如果用System.Net,可以这样来获得所accept的客户端的IP地址:

TcpClient client = myListener.EndAcceptTcpClient(ar);
IPAddress clientIP =((IPEndPoint)(client.Client.RemoteEndPoint)).Address;

你可以用一个数组来保存各个已经连接的clientIP,在接受连接时进行判断,如果这个IP已经连接了,则拒绝接受连接。

拒绝接受连接的方法:
if (HaveBeenAccpeted(clientIP)) // 如果这个IP已经连接了
{
NetworkStream networkStream = client.GetStream();
networkStream.Close(); // 马上断开这个TCP连接
client.Close();
}

System.Net编程我也是初学,以上意见仅供参考。