好的我正在做的如下,我启动一个构造函数,其中Socket正在为服务器进行侦听。 (绑定,倾听等) 然后我将生成一个Thread来启动一个函数来查找客户端的来电,他必须接受这些来电。 在接受后,必须将连接的Socket放在列表中。 之后,正在制作一个新线程。
但他坚持接受客户,我真的很关注它。 希望不要多问。
First-chance exception at 0x010820b1 in ChatServer.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x010820b1 in ChatServer.exe: 0xC0000005: Access violation reading location 0x00000000.
有点多 - > ServerCode:
int main(int argc, char* argv[])
{
//Constructor that takes care of making connection
//Throw in a new Thread
CreateThread(0,0,&ServerListenThread,0,0,0);
//while loop to get input and pass it to the SendMessages function
//function being called within a Thread
DWORD WINAPI ServerListenThread(LPVOID pParam)
{
while(1)
CServerObj->StartListenClient();
return 0;
}
void CServer::StartListenClient()
{
sockaddr_in i_addr;
int i_addrlen = sizeof(i_addr);
SocketC = accept(SocketS,(struct sockaddr*)&i_addr,&i_addrlen); <<<Here it gives the Access Violation< at the accept
{
cout << "A Connection was found with :" <<endl;
}
SocketS = SocketC;
if(SocketS != INVALID_SOCKET)
{
vClientList.push_back(SocketS);
CreateThread(0,0,&ServerRecThread, (void*)SocketS, 0,0);
}
}
答案 0 :(得分:1)
您最有可能遇到尝试通过陈旧迭代器访问向量中的值的情况。由于您正在使用线程,因此可能有一个场景,其中一个线程正在向向量添加,这导致重新分配向量的内容。因此,如果另一个线程同时迭代向量,它的迭代器将在重新分配原始向量的内容后失效,并且您将遇到您遇到的错误,迭代器指向的内容不是在矢量中。
如果您的vClientVector
在线程之间共享,并且在其他线程正在读取它时有一个线程写入它,那么它应该使用互斥体保护,可能是读取器/写入器类型,以便允许多个读者,但一次只有一个作家。