(linux)Socket返回0

时间:2014-05-28 07:44:43

标签: c++ linux sockets

虽然我知道0是Linux中的有效文件描述符&可以通过调用socket()返回,但随后对bind或setsockopt的调用失败,错误代码为:88(非套接字上的操作)。 此外,我无法理解我可能已关闭我的stdin文件描述符,以获得套接字值为0。 这是我的代码片段..它是一个简单的套接字类..

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);

我使用相同的方法写下许多套接字程序,而不是在这个程序中出错。

2 个答案:

答案 0 :(得分:1)

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

由于在<之前评估=(优先级较低),因此不正确,您需要添加括号:

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

如果你正在使用GCC,你应该设置-W -Wall选项以获得warning这类错误,MVSC使用至少/W4

答案 1 :(得分:0)

<块引用>

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

我刚刚在我的一个项目中发现了这种情况。考虑这种情况:

int sock;

void init()
{
  sock = 0;
}

void start()
{
  sock = socket(...);
}

void cancel()
{
  close(sock);
}

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

就我而言,错误处理程序在调用 cancel 后调用了 init,这导致 close(0) 并因此关闭了标准输入。