虽然我知道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);
我使用相同的方法写下许多套接字程序,而不是在这个程序中出错。
答案 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)
并因此关闭了标准输入。