собственно сабж Код (Text): DWORD WINAPI SockMgrThr(PVOID lParam) { SocketMgr* mgr = (SocketMgr*)lParam; WSAData wsa; WSAStartup(MAKEWORD(2,0), &wsa); while(true) { fd_set fd_read; FD_ZERO(&fd_read); ==> for(list<Socket*>::iterator it = mgr->GetSockList().begin(); it != mgr->GetSockList().end(); ++it) { FD_SET((*it)->GetSocket(), &fd_read); if((*it)->ReadySend()) (*it)->_send(); } timeval time; time.tv_sec = 0; time.tv_sec = 500000; select(0, &fd_read, NULL, NULL, &time); for(uint32 i = 0; i < fd_read.fd_count; i++) { Socket* sock = mgr->FindSocket(fd_read.fd_array[i]); sock->_recv(); } } WSACleanup(); return 0; } код потока, SocketMgr - самопальный класс, Socket - обертка для обычного SOCKET'a валиться на месте помеченном ==> грешить на синхронизацию потоков вроде не приходиться... подскажите кто вообще с этой ошибкой сталкивался(мне мало что она говорит), буду благодарен любой инфе, заранее спасибо.
LLInuoH 0xC000000D - STATUS_INVALID_PARAMETER - An invalid parameter was passed to a service or function. Скорее всего, проблема с параметром для winsockapi. валиться на месте помеченном ==> В for'е вряд ли есть что-либо кроме Си++, а вот (*it)->ReadySend() и, особенно, (*it)->_send() надо смотреть. Сколько элементов в списке, больше FD_SETSIZE? WSAStartup завершился успешно?
инициализация проходит успешно(стартап ретурнит 0), самое интересное что не проходит неодной итерации for'a, а валиться все в первой итерации while'a... для большей ясности приведу еще немного кода... Код (Text): SocketMgr* mgr; int _tmain(int argc, _TCHAR* argv[]) { mgr = new SocketMgr(); WSAData ws; WSAStartup(MAKEWORD(2,0), &ws); char ip[16]; int16 port; RecvServer(ip, &port); Socket* s = mgr->AddSocket(); std::cout << "IP and wa recive : " << ip << ':' << port << '\n'; mgr->Run(mgr); getch(); WSACleanup(); delete mgr; return 0; } в функции Run только создается поток, а как параметр указатель на SocketMgr... Код (Text): list<Socket*> GetSockList() {return sock_list;} Код (Text): int32 Socket::_send() { int32 rez = 0; while(rez) { rez = send(m_sock, w_buf.GetBufPtr(), w_buf.GetSize(), 0); if(rez == -1) { OUTPUT_ERROR("can't send data!") return -1; } int8* buf = new int8[rez]; w_buf.Read(buf, rez); delete[] buf; } OUTPUT_ERROR("send") return 0; } макрос в _send'e не выполняется ниразу...
LLInuoH для большей ясности приведу еще немного кода Мне ясней не стало. + ты напустил тумана "валиться на месте помеченном ==> ... валиться все в первой итерации while'a"
ну валится все именно в этом месте, и происходит это при первой итерации, тоесть код ниже этого места ниразу не выполнятся, я это хотел сказать, если интересуют еще какиелибо участи кода - выложу...
LLInuoH Либо даешь весь код с параметрами, которые позволят воспроизвести ошибку. Либо сам локализуешь ее, например, добавляя отладочные сообщения (afaik использование отладчика для thread + winsock не всегда уместно). И если после локализации останутся вопросы, задашь тут.
хорошо, вот мой код... буду очень признателен если ктонибудь покопается, бьюсь над ним уже пару дней...
LLInuoH Код (Text): // SocketMgr.cpp ... DWORD WINAPI SockMgrThr(PVOID lParam) { ... FD_ZERO(&fd_read); // // в твоей версии между ... begin(); it != ..., перед точкой_с_запятой, происходит вызов // деструктора того, что вернула mgr->GetSockList() и it начинает указывать никуда, // программа падает на operator!= // // for(list<Socket*>::iterator it = mgr->GetSockList().begin(); it != mgr->GetSockList().end(); ++it) list<Socket*> ls = mgr->GetSockList(); for(list<Socket*>::iterator it = ls.begin(); it != ls.end(); ++it) // { ...
огромное спасибо, помогло, вообще по идее там должен был возвращаться указатель на лист сокетов, чет подзабил, а потом забыл исправить, еще раз спасибо, так бы долго ковырялся...