【问题标题】:(linux)Socket returns 0(linux)Socket 返回 0
【发布时间】:2014-07-17 07:43:34
【问题描述】:

虽然我知道 0 是 linux 中的有效文件描述符,并且可以通过调用 socket() 返回,但随后对 bind 或 setsockopt 的调用失败,错误代码为:88(非套接字操作)。 我也无法理解我可能在哪里关闭了我的标准输入文件描述符,以便将套接字值设为 0。 这是我的代码 sn-p.. 它是一个简单的套接字类..

bool serverHandler::startServer(string strAddress,int port)
{
    //memset(&m_srvAddr,'\0',sizeof(m_srvAddr));
    m_srvSock = -1;
    if(m_srvSock = socket(AF_INET,SOCK_STREAM,0) < 0)
        cout<<"serverHandler: Failed to create server socket."<<endl;
    m_srvAddr.sin_family = AF_INET;
    m_srvAddr.sin_addr.s_addr = inet_addr(strAddress.c_str());                            
    m_srvAddr.sin_port = htons(port);
    cout<<"Socket value:"<<m_srvSock<<" for "<<strAddress<<" "<<port<<endl;
    if (bind(m_srvSock,(struct sockaddr *) &m_srvAddr,sizeof(m_srvAddr)) < 0)                     
    {
        cout<<"Failed with errno:"<<errno<<endl;
        return false;
    }
    if (listen(m_srvSock, MAX_PENDING) < 0)
    {
        return false;                
    }
}

而且对这个函数的调用很简单:

srvHandler.startServer("127.0.0.1",7878);

我用同样的方法写了很多socket程序,没有弄明白这个有什么问题。

【问题讨论】:

    标签: c++ linux sockets


    【解决方案1】:
    if(m_srvSock = socket(AF_INET,SOCK_STREAM,0) < 0)
    

    不正确,因为&lt;= 之前被评估(较低优先级),您需要添加括号:

    if((m_srvSock = socket(AF_INET,SOCK_STREAM,0)) < 0)
    

    如果您使用的是 GCC,您应该设置-W -Wall 选项以针对此类错误获取warning,MVSC 至少使用/W4

    【讨论】:

    • 感谢您的更正,但无论如何 m_srvSock 的值为零并且它会通过检查。我有一个 cout,它的值显示为 0。
    • 在我更改了“sockaddr_in”成员初始化的顺序后,它得到了解决。(在 s_addr 之前初始化端口)我不知道它背后的概念是什么,有什么亮点吗?
    • 奎托斯,它背后没有光。那不是你的问题。
    • 是的,但最初我将文件描述符设置为 0 ,这样做之后,我开始获得正常值..我不知道如何..
    【解决方案2】:

    我无法理解我可能在哪里关闭了我的标准输入文件描述符以便将套接字值设为 0。

    我刚刚发现这是如何在我的一个项目中发生的。考虑这种情况:

    int sock;
    
    void init()
    {
      sock = 0;
    }
    
    void start()
    {
      sock = socket(...);
    }
    
    void cancel()
    {
      close(sock);
    }
    

    只要每个start 始终最多调用一次cancel,并且您永远不会在两者之间调用init,这就可以正常工作。

    在我的例子中,一个错误处理程序在调用init 之后调用cancel,这导致close(0) 并因此关闭标准输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2019-09-26
      • 1970-01-01
      • 2020-09-28
      • 2013-07-29
      • 2011-08-27
      • 2021-10-28
      相关资源
      最近更新 更多