线程中不接受套接字

时间:2012-07-19 13:05:41

标签: c++ multithreading sockets

G'day伙计们。最近,我决定尝试使用TCP / IP技能,所以目前我正在尝试使用套接字编写某种服务器/客户端聊天。

我想问的是交互线程和套接字。具体来说,我对accept()函数感兴趣。我试着搜索它,但没有找到类似的情况。

所以,问题是 - 当我试图在线程之外接受套接字时,它完美地工作。相反,如果我在线程中使用它,它的'调用就会被忽略。

所以,这是调用accept函数的方法:

void ServerSocket::Accept( void )
{
    sockaddr_in saClientAddr;
    int nCliSize = sizeof( sockaddr_in );
    sClient = accept( sSocket, (sockaddr*)&saClientAddr, &nCliSize );

    if( sClient == INVALID_SOCKET )
    {
        GetError();
        return;
    }
}

所以,按照以下方式使用它:

CServerObj.Accept();

它完美运行,服务器等待来自客户端的输入然后恢复。 但是,如果它在线程中使用:

unsigned __stdcall ServerThread( void* Param )
{
    while( true )
    {
        CServerObj.Accept();
    }
    return 0;
}

然后开始线程:

_beginthreadex( 0, 0, &ServerThread, 0, 0, NULL );

然后每次忽略accept()并且程序进入无限循环,告诉错误(GetError方法)。

所以,我对这种情况感到困惑。这是因为线程调用是异步的,因此它不等待客户端的响应吗?

无论如何,如果有人能解释我做错了什么,我将不胜感激。


所以,经过一些试验&努力,我想出了这种奇怪行为背后的原因。似乎CServerObj被声明为static两次被称为构造函数,因此渲染bind函数无用。数字,这对我来说是个愚蠢的错误。

但是,现在我有另一个问题 - 为什么构造函数在那里被调用了两次? 标题中的代码如下所示:

#ifndef __BLAH_H__
#define __BLAH_H__

class ServerSocket
{
    //some code
}
static ServerSocket CServerObj;

#endif // __BLAH_H__

我想这可能是因为变量是在头文件中声明的......但不应该#ifndef保护它免受第二次声明的影响吗?

0 个答案:

没有答案