请教高手如何用TCP/IP协议高效的向多个局域网IP发起连接.
请教高手如何用TCP/IP协议高效的向多个局域网IP发起连接.尤其是对方无法连接怎么减小时间又不影响可靠性.希望有这方面的示例.如下简单试验代码,虽然是多线程,但完成200个连接扫描需时仍要两三分钟.从反馈信息来看,感觉只有十来个线程可以同时工作,而其它线程得待前十个线程完成后才能启动.而每个无法连接需时20秒左右.请大家帮忙解决.多谢.
using System;--------------------编程问答-------------------- 用广播可以做到高效..但不提昌用!
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Net; // Endpoint
using System.Net.Sockets; // Socket namespace
using System.Threading;
using System.Collections;
namespace nettry
{
/// <summary>
/// Window1.xaml 的交互逻辑
/// </summary>
///
public class MySock
{
public Socket sock;
public byte[] readBuffer= new byte[256];
public byte[] sendBuffer;
public IPAddress ip;
public Thread th;
}
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void sendNetMsg(string iptext, string msgtext)
{
try
{
IPAddress epServer = IPAddress.Parse(iptext);
MySock mysock = new MySock();
mysock.sendBuffer = Encoding.ASCII.GetBytes(msgtext.ToCharArray());
mysock.ip = IPAddress.Parse(iptext);
if ((mysock.th==null) || (!mysock.th.IsAlive))
{
mysock.th = new Thread(new ParameterizedThreadStart(MsgThread));
mysock.th.Start(mysock);
}
}
catch (Exception ex)
{
richTextBox1.AppendText(ex.Message);
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
byte i;
//测试多线程向局域网多个IP发信息。
for (i = 5; i < 210; i++)
{
sendNetMsg("192.168.0." + i.ToString(), "hello"+i.ToString());
}
}
catch
{
}
}
private void MsgThread(Object sock)
{
MySock mysock = sock as MySock;
mysock.sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
mysock.sock.Connect(mysock.ip, 399);
if (mysock.sock != null && mysock.sock.Connected)
{
if (mysock.sock.Poll(1000000, SelectMode.SelectWrite) == true)
{
mysock.sock.Send(mysock.sendBuffer, mysock.sendBuffer.Length, 0);
Thread.Sleep(500);
if (mysock.sock.Poll(1000000, SelectMode.SelectRead) == true)
{
int nBytesRec = mysock.sock.Receive(mysock.readBuffer);
if (nBytesRec > 0)
{
string sRecieved = Encoding.ASCII.GetString(mysock.readBuffer, 0, nBytesRec);
richTextBox1.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (ThreadStart)delegate
{
richTextBox1.AppendText(sRecieved);
});
}
}
}
}
mysock.sock.Shutdown(SocketShutdown.Both);
mysock.sock.Close();
}
catch (Exception ex)
{
richTextBox1.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (ThreadStart)delegate
{
richTextBox1.AppendText(ex.Message + "Server Connect failed!");
});
}
}
}
}
补充:.NET技术 , C#