伙计们。最近,我决定尝试使用 TCP/IP 技术,所以目前我正在尝试使用套接字编写某种服务器/客户端聊天。
我想问的是交互线程和套接字。具体来说,我对 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
保护它免受第二次声明?