当前位置:编程学习 > C#/ASP.NET >>

请教高手如何用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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,