2012-01-11 4 views
1

Хорошо, что я делаю, как следует, я начинаю конструктор, где сокет делается для сервера, чтобы слушать. (привязка, прослушивание и т. Д.) Затем я создам Thread для запуска функции, которая ищет входящие звонки от клиентов, которые он должен принять. AFTER acception Соединитель, который подключен, должен быть помещен в список. После этого создается новая нить.C++ Тема/векторный чат

Но он держится за прием клиентов, и я действительно просмотрел его. Надеюсь, что это не так много, чтобы спросить.

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.

Это немного much-> 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

Вы можете проверить стек вызовов в режиме отладки и опубликовать его здесь? Вы только разместили информацию о том, что _Inside не удалось, но какая часть вашего кода, называемая этим _Inside, более интересна. – Zuljin

+0

Вторым фактором может быть завершающее условие цикла for в CServer :: SendMessages, используйте itl! = VClientVector.end(), чем меньше оператор создает здесь непредсказуемые результаты. – Jack

ответ

1

Вы, скорее всего, работаете в сценарий, где вы пытаетесь получить доступ к стоимости в вашем векторе через несвежий итератор. Поскольку вы используете потоки, у вас может быть сценарий, когда один поток добавляется к вектору, и это вызвало перераспределение содержимого вектора. Таким образом, если другой поток выполняет итерацию через вектор в одно и то же время, его итератор будет недействительным после перераспределения содержимого исходного вектора, и вы столкнетесь с ошибкой, с которой вы сталкиваетесь, где итератор указывает на контент, который не является внутри вектора.

Если ваш vClientVector разделяется между потоками, и в нем есть нить, в то время как другие потоки читают его, тогда он должен быть защищен мьютексом, вероятно, типа читателя/писателя, чтобы позволить нескольким читателям, но только один писатель за раз.

+0

Итак, если я правильно вас понимаю, я должен защитить его с помощью Mutex. Но дело в том, что он даже зависает с одним клиентом, подключенным к нему. Итак, если подключиться, я вижу, что '_Ptr' (debug) имеет значение 128, которое является sock_identifier, который необходимо сохранить. но вектор пуст и остается таким. –

+0

Код, который вы опубликовали, очень сбивает с толку ... Я не вижу, откуда вызывается '_Inside', поэтому мне просто нужно сделать обоснованное предположение о том, что создает эту ошибку ... В общем, если у вас есть общий ресурс, и вы читаете его и пишете, он должен быть защищен. BTW, если вы создаете поток, у вас автоматически есть два потока - родительский поток и порожденный «дочерний» поток. При этом я все еще немного смущен тем, как ваши потоки взаимодействуют друг с другом. – Jason

+0

после принятия нового запроса на соединение сервером, он помещает сокет, который подключен к вектору. Затем он передает Socket для создания Thread. Эта тема предназначена только для получения данных от этого клиента perticulair. Эти данные передаются другой функции 'int CServer :: SendMessages (строка sBuf)', которая будет удерживать вектор (с подключенными сокетами и отправляет его в сокеты внутри). –

Смежные вопросы