【问题标题】:C++ Failing at SOCKET accept() MethodC++ 在 SOCKET accept() 方法中失败
【发布时间】:2010-10-23 16:54:29
【问题描述】:

我目前正在制作服务器,我学会了制作这样的东西:

while(true)
{
     SOCKET s = accept(s, ....)

     // do something with the connection
     printf("connection\n");
}

我了解到它会在没有连接时卡在接受(..)。 在我的程序中还没有任何连接,但是连接溢出了??我的意思是我的控制台收到了带有“连接”的垃圾邮件。

那怎么了?


THX 伙计们,我现在修好了 :)

【问题讨论】:

  • 对于 Windows 用户,请确保您没有在代码中的任何位置调用 WSACleanup();,这些位置可能位于您创建的套接字的 自定义类 中。

标签: c++ sockets


【解决方案1】:

很可能它会立即返回一个您似乎没有检查的错误。例如。可能是 s 没有正确创建,等等。

编辑:刚刚注意到您将 accept() 的结果分配给相同的 's',这是非常错误的。你的 's' 是一个通用的监听套接字,大概是由 socket() 创建的,由 bind() 绑定并由 listen() 设置为监听,而 accept() 的返回值是另一个你应该用于传输数据的套接字。

看看这个例子(刚刚通过谷歌搜索):http://www.cs.odu.edu/~cs476/fall03/lectures/sockets.htm

【讨论】:

  • 啊该死的,在我的源代码中,服务器 Socket 被命名为 m_Server 而不是 s :)
【解决方案2】:

我调试了一下,我得到的每个失败套接字都有值:4294967295。

【讨论】:

    【解决方案3】:

    我添加了一些检查:

    while(true)
    {
        SOCKET s = 
            accept(m_Socket, (sockaddr*)&from, &fromlen);
    
        if(s != SOCKET_ERROR)
        {
            printf("Client connected to the Server. ");
            Client* client = new Client(s); // Memory Leak here .. i know
        }
    }
    

    我的 CPU 是 16%,虽然没有连接任何客户端。

    【讨论】:

      【解决方案4】:

      调用 WSAGetLastError() 并查看它返回的内容。然后可以将此错误代码输入到错误查找工具中(您可以在 Visual Studio 的工具菜单中找到它)。您很可能错误地初始化了您的服务器套接字。

      【讨论】:

      • 哦,对不起,我忘了使用listen() -.-
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      相关资源
      最近更新 更多