用c#写的网络程序,开多线程时,有的线程会阻塞在accept函数那儿,会不会是不同线程里的accept冲突啊?如果是,该如何解决?因为我的accept时在单独的一个ftp类里,多线程不是在这个类里开的。

解决方案 »

  1.   

    accept本身就是一个阻塞线程函数啊。他会在那里监听,直到接收到数据包之后才会继续往下走。
    贴出源码来看看,才知道你的程序会不会有同步的问题。只要接受数据的那段。
      

  2.   

            public bool ListPort(SiteInfo stSiteInfo,string strDir)
            {
                try
                {
                    LogOffServer();                if (!LogOntoServer(stSiteInfo))
                        return false;                Socket hListenSocket = CreateListenChannel();
                    if (hListenSocket == null)
                        return false;                string strCommand = "LIST " + strDir;
                    if (!FtpCommand(strCommand))
                        return false;
                    if (m_nReplyCode >= 400 || m_nReplyCode <= 0)
                        return false;                Socket DataSocket = hListenSocket.Accept();//调试发现有时会停在这一句
                    if (DataSocket == null)
                        return false;                if (!ReadDataChannel(DataSocket))
                    {
                        hListenSocket.Close();
                        hListenSocket = null;
                        return false;
                    }
                    if (m_nReplyCode >= 400 || m_nReplyCode <= 0)
                    {
                        hListenSocket.Close();
                        hListenSocket = null;
                        return false;
                    }
                    hListenSocket.Close();
                    hListenSocket = null;
                    bPortMode = true;
                    return true;
                }
                catch(Exception ee)
                {
                    m_strError = "ListPort() ERROR:" + ee.Message;
                    return false;
                }
            }
    这个函数在ftp类里,调用时,在主程序开一个线程,定义一个ftp的对象ftp1,然后进行各项操作。
    当我开启多个线程时,也就是多个ftp对象一起工作时,才会出现阻塞,单个线程时没有问题。
      

  3.   

    每次accept之前都新开一个空闲端口