首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >监听套接字仅监听一次

监听套接字仅监听一次
EN

Stack Overflow用户
提问于 2012-11-30 14:21:53
回答 2查看 1.3K关注 0票数 0

我在下面的服务器套接字代码中遇到了一个问题-- Main()方法中的循环只执行一次,不接受任何进一步的输入。

代码语言:javascript
复制
class Server
{
    public Socket servSock(int Port)
    {
        Socket s1 = null;
        IPHostEntry ipHE = Dns.GetHostEntry("localhost");
        IPAddress ipA = ipHE.AddressList[0];
        IPEndPoint ipEp = new IPEndPoint(ipA, Port);
        s1 = new Socket(ipEp.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        s1.Bind(ipEp);

        return s1;
    }

    const int BUFFSIZE = 1024;
    const int BACKLOG = 255;

    static void Main(string[] args)
    {            
        Nwork nwork = new Nwork();
        Socket cl = null;
        Socket s = nwork.servSock(400);
        s.Listen(BACKLOG);

        byte[] rcvBuffer = new byte[BUFFSIZE];            

        for (; ; )
        {
            string text = "";

            Console.Clear();
            cl = s.Accept();                    
            Console.Write("Handling Client >> " + cl.RemoteEndPoint +"\n\n\n");
            cl.Receive(rcvBuffer, BUFFSIZE, SocketFlags.None);
            text = Encoding.ASCII.GetString(rcvBuffer, 0, BUFFSIZE).TrimEnd('\0');
            Console.Write(text);
            cl.Close();
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-30 16:16:46

我不知道"Nwork“是什么,但我怀疑它是你的bug的来源。只需手动初始化套接字就可以了,并允许后续连接。

代码语言:javascript
复制
static void Main(string[] args)
{
    Socket s = new Socket(SocketType.Stream, ProtocolType.TCP);
    Socket cl = null;
    System.Net.IPEndPoint endpoint = new System.Net.IPEndPoint(0, 400); // listen on all adapters on port 400
    s.Bind(endpoint);

    s.Listen(BACKLOG);

    byte[] rcvBuffer = new byte[BUFFSIZE];

    for (; ; )
    {
        string text = "";

        Console.Clear();
        cl = s.Accept();
        Console.Write("Handling Client >> " + cl.RemoteEndPoint + "\n\n\n");
        cl.Receive(rcvBuffer, BUFFSIZE, SocketFlags.None);
        text = Encoding.ASCII.GetString(rcvBuffer, 0, BUFFSIZE).TrimEnd('\0');
        Console.Write(text);
        cl.Close();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2012-11-30 14:36:04

如果不深入研究您的代码,我会尝试在您的for循环中添加s.Listen(BACKLOG)。

请注意,通过这种方式,您只能同时处理套接字连接,如果另一个人试图打开套接字连接,您的进程将忙于接收来自前一个连接的数据。

这取决于您的场景,但您可能希望异步实现它。

如果你决定这样做,This link可能会很有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13640062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档