Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 插座不是';线程中不可接受_C++_Multithreading_Sockets - Fatal编程技术网

C++ 插座不是';线程中不可接受

C++ 插座不是';线程中不可接受,c++,multithreading,sockets,C++,Multithreading,Sockets,G'day伙计们。最近,我决定尝试使用TCP/IP的技巧,所以目前我正在尝试使用套接字编写某种服务器/客户端聊天 我想问的是交互线程和套接字。具体来说,我对accept()函数感兴趣。我试着搜索它,但没有找到类似的情况 所以,问题是——当我尝试在线程外部接受套接字时,它工作得非常好。相反,如果我在线程中使用它,它的调用就会被忽略 下面是调用accept函数的方法: void ServerSocket::Accept( void ) { sockaddr_in saClientAddr;

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 );
然后开始线程:

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
是否应该保护它不受第二次声明的影响?

您使用的是什么套接字实现?以及不断报告的错误是什么?另外,线程从哪里获取其CServerObj实例?通常,这样一个东西作为“Param”传入,适当地强制转换,然后调用它的方法。如果我正确理解了您的问题,我想是WinSock。每个线程至少应该使用不同的
sClient
句柄。是的,服务器线程有一个套接字句柄,每个客户端线程有单独的套接字句柄。