поток вылетает с ошибкой 0xC000000D

Тема в разделе "WASM.WIN32", создана пользователем LLInuoH, 25 окт 2008.

  1. LLInuoH

    LLInuoH New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    15
    собственно сабж
    Код (Text):
    1. DWORD WINAPI SockMgrThr(PVOID lParam)
    2. {
    3.     SocketMgr* mgr = (SocketMgr*)lParam;
    4.     WSAData wsa;
    5.     WSAStartup(MAKEWORD(2,0), &wsa);
    6.     while(true)
    7.     {
    8.         fd_set fd_read;
    9.         FD_ZERO(&fd_read);
    10. ==>     for(list<Socket*>::iterator it = mgr->GetSockList().begin(); it != mgr->GetSockList().end(); ++it)
    11.         {
    12.             FD_SET((*it)->GetSocket(), &fd_read);
    13.             if((*it)->ReadySend())
    14.                 (*it)->_send();
    15.         }
    16.         timeval time;
    17.         time.tv_sec = 0;
    18.         time.tv_sec = 500000;
    19.         select(0, &fd_read, NULL, NULL, &time);
    20.         for(uint32 i = 0; i < fd_read.fd_count; i++)
    21.         {
    22.             Socket* sock = mgr->FindSocket(fd_read.fd_array[i]);
    23.             sock->_recv();
    24.         }
    25.     }
    26.     WSACleanup();
    27.     return 0;
    28. }
    код потока, SocketMgr - самопальный класс, Socket - обертка для обычного SOCKET'a
    валиться на месте помеченном ==>
    грешить на синхронизацию потоков вроде не приходиться...
    подскажите кто вообще с этой ошибкой сталкивался(мне мало что она говорит), буду благодарен любой инфе, заранее спасибо.
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    LLInuoH
    0xC000000D - STATUS_INVALID_PARAMETER - An invalid parameter was passed to a service or function.
    Скорее всего, проблема с параметром для winsockapi.

    валиться на месте помеченном ==>
    В for'е вряд ли есть что-либо кроме Си++, а вот (*it)->ReadySend() и, особенно, (*it)->_send() надо смотреть.

    Сколько элементов в списке, больше FD_SETSIZE?
    WSAStartup завершился успешно?
     
  3. LLInuoH

    LLInuoH New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    15
    инициализация проходит успешно(стартап ретурнит 0), самое интересное что не проходит неодной итерации for'a, а валиться все в первой итерации while'a...
    для большей ясности приведу еще немного кода...
    Код (Text):
    1. SocketMgr* mgr;
    2.  
    3. int _tmain(int argc, _TCHAR* argv[])
    4. {
    5.     mgr = new SocketMgr();
    6.     WSAData ws;
    7.     WSAStartup(MAKEWORD(2,0), &ws);
    8.     char ip[16];
    9.     int16 port;
    10.     RecvServer(ip, &port);
    11.     Socket* s = mgr->AddSocket();
    12.     std::cout << "IP and wa recive : " << ip << ':' << port << '\n';
    13.     mgr->Run(mgr);
    14.     getch();
    15.     WSACleanup();
    16.     delete mgr;
    17.     return 0;
    18. }
    в функции Run только создается поток, а как параметр указатель на SocketMgr...
    Код (Text):
    1. list<Socket*> GetSockList() {return sock_list;}
    Код (Text):
    1. int32 Socket::_send()
    2. {
    3.     int32 rez = 0;
    4.     while(rez)
    5.     {
    6.         rez = send(m_sock, w_buf.GetBufPtr(), w_buf.GetSize(), 0);
    7.         if(rez == -1)
    8.         {
    9.             OUTPUT_ERROR("can't send data!")
    10.             return -1;
    11.         }
    12.         int8* buf = new int8[rez];
    13.         w_buf.Read(buf, rez);
    14.         delete[] buf;
    15.     }
    16.     OUTPUT_ERROR("send")
    17.     return 0;
    18. }
    макрос в _send'e не выполняется ниразу...
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    LLInuoH
    для большей ясности приведу еще немного кода
    Мне ясней не стало.

    + ты напустил тумана "валиться на месте помеченном ==> ... валиться все в первой итерации while'a"
     
  5. LLInuoH

    LLInuoH New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    15
    ну валится все именно в этом месте, и происходит это при первой итерации, тоесть код ниже этого места ниразу не выполнятся, я это хотел сказать, если интересуют еще какиелибо участи кода - выложу...
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    LLInuoH
    Либо даешь весь код с параметрами, которые позволят воспроизвести ошибку.
    Либо сам локализуешь ее, например, добавляя отладочные сообщения (afaik использование отладчика для thread + winsock не всегда уместно). И если после локализации останутся вопросы, задашь тут.
     
  7. LLInuoH

    LLInuoH New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    15
    хорошо, вот мой код...
    буду очень признателен если ктонибудь покопается, бьюсь над ним уже пару дней...
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    LLInuoH
    Код (Text):
    1.  // SocketMgr.cpp
    2. ...
    3. DWORD WINAPI SockMgrThr(PVOID lParam)
    4. {
    5. ...
    6.     FD_ZERO(&fd_read);
    7. //
    8. // в твоей версии между ... begin(); it != ..., перед точкой_с_запятой, происходит вызов
    9. // деструктора того, что вернула mgr->GetSockList() и it начинает указывать никуда,
    10. // программа падает на operator!=
    11. //
    12. //  for(list<Socket*>::iterator it = mgr->GetSockList().begin(); it != mgr->GetSockList().end(); ++it)
    13.     list<Socket*> ls = mgr->GetSockList();
    14.     for(list<Socket*>::iterator it = ls.begin(); it != ls.end(); ++it)
    15. //
    16.     {
    17. ...
     
  9. LLInuoH

    LLInuoH New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    15
    огромное спасибо, помогло, вообще по идее там должен был возвращаться указатель на лист сокетов, чет подзабил, а потом забыл исправить, еще раз спасибо, так бы долго ковырялся...