我是初接触C#与Soket...最近想开发一套简单的通讯软件
我用做Clien与Server
看了很多资料,了解了Server端,只要开放一个端口,就能工作
我觉得很怪...
如下面:
server = new TcpListener(localAddr, port);
server.Start();
NetworkStream networkStream;
while (true)
{
TcpClient client = server.AcceptTcpClient();
}而很多软件都是公开它的localAddr与port
如果这样...别人是否能与一个连接这个服务IP与端口,然后送数据过去,这样..会不会造成网络堵塞了?????不知道明不明白我的问题..呵如果你知道我的软件的连接IP与端口...你是否能开发一个软件,一直来连接,还传送一些数据来堵塞我的网络了?

解决方案 »

  1.   

    to :while (true)
    {
    TcpClient client = server.AcceptTcpClient();
    }
    死循环??
    换个想法,把socket设置为异步套接字,或者加个线程来做服务器,那样你就不会碰到网络堵塞了
      

  2.   

    TcpListener mListener = new TcpListener(new IPEndPoint(mAddress, mPort));
                mListener.Start();
                while (mRunning) {
                    try {
                        TcpClient client = mListener.AcceptTcpClient();
                        client.Client.NoDelay = true;
                        if (ClientAccepted != null) {
                            //同步调用
                            //ClientAccepted(this, new StreamReaderWriter(client));
    //异步单播调用
                            ClientAccepted.BeginInvoke(this, new StreamReaderWriter(client), new AsyncCallback(ProcessClient), client);
                            //client.Close();
                        }
                       //bool b= mListener.Pending();
                       //mListener.Server.Close();
                    }
                    catch (Exception ex) {
                        Console.WriteLine(ex.Message);
                    }
                }
      

  3.   

    delegate void AcceptClient(NetListener sender,StreamReaderWriter readWriter);
        class NetListener:IDisposable {
             //mListener;       public void Start() {
                //循环监听
                mRunning = true;
                TcpListener mListener = new TcpListener(new IPEndPoint(mAddress, mPort));
                mListener.Start();
                while (mRunning) {
                    try {
                        TcpClient client = mListener.AcceptTcpClient();
                        client.Client.NoDelay = true;
                        if (ClientAccepted != null) {
                            //TODO:此处可以改为异步以保证能够及时响应请求
                            //ClientAccepted(this, new StreamReaderWriter(client));
                            ClientAccepted.BeginInvoke(this, new StreamReaderWriter(client), new AsyncCallback(ProcessClient), client);
                            //client.Close();
                        }
                       //bool b= mListener.Pending();
                       //mListener.Server.Close();
                    }
                    catch (Exception ex) {
                        Console.WriteLine(ex.Message);
                    }
                }
                mListener.Stop();
                //mListener.Stop();
               //mListener.
            }
            private void ProcessClient(IAsyncResult result) {
                
            }
            private int mPort;
            bool mRunning = false;
            public int Port {
                get { return mPort; }
                set { mPort = value; }
            }
            private IPAddress mAddress;        public IPAddress Address {
                get { return mAddress; }
                set { mAddress = value; }
            }
            public void Stop() {
                mRunning = false;
            }
            public event AcceptClient ClientAccepted;
            #region IDisposable 成员
            public void Dispose() {
                
            }        #endregion
        }
    }
      

  4.   

    这个事件只能单播,否则会抛出异常。此事件不能多播调用,因为把同一个client交给几个方法去处理是不安全的。