Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сокеты и поток. Есть ли дружба между ними? ошибка при инициализации сокета 
:(
    Опции темы
lat
Дата 7.4.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Код

bool ping(const char *ip) {
  //----------------------
  // Initialize Winsock
  WSADATA wsaData;
  int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  if (iResult != NO_ERROR)
    printf("Error at WSAStartup()\n");

  //----------------------
  // Create a SOCKET for connecting to server
  SOCKET ConnectSocket;
  ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (ConnectSocket == INVALID_SOCKET) {
    printf("Error at socket(): %ld\n", WSAGetLastError());
    WSACleanup();
    return false;
  }

  //----------------------
  // The sockaddr_in structure specifies the address family,
  // IP address, and port of the server to be connected to.
  sockaddr_in clientService; 
  clientService.sin_family = AF_INET;
  clientService.sin_addr.s_addr = inet_addr(ip);
  clientService.sin_port = htons( 80 );

  //----------------------
  // Connect to server.
  if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
    printf( "Failed to connect.\n" );
    WSACleanup();
    return false;
  }

  printf("Connected to server.\n");
  WSACleanup();
  return true;
}

DWORD WINAPI scanip(LPVOID P) {    
    for (int i = 0; i <= 255; i++) {
        for(int y = 0; y <= 255; y++) {
            std::string ip = "192.168." + IntToString(i) + "." + IntToString(y);            
            if (ping(ip.c_str())) {
                cout << ip.c_str() << "PASSED";
            }
            else {
                cout << ip.c_str() << "FAILED";
            }
        }
    }
    return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{    
    
    DWORD  lpThreadId;
    HANDLE ht = CreateThread(NULL, 0, scanip, LPVOID(0), 0, &lpThreadId);        
    CloseHandle(ht);
    return 0;
}


Уже битый час ковыряюсь со следующим жуком: 
В дебаге четко видно, что прога слетает на 
Код
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  smile 
Причем это в только в 9-й студии!  smile  А в CodeGear - после второй итерации и на том же куске кода.  smile 
Что же это может быть?


Это сообщение отредактировал(а) lat - 7.4.2009, 20:47
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Lazin
Дата 7.4.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 5
Всего: 154



код ошибки равен чему?
в любом случае это что-то из:
  • WSASYSNOTREADY The underlying network subsystem is not ready for network communication.
  • WSAVERNOTSUPPORTED The version of Windows Sockets support requested is not provided by this particular Windows Sockets implementation.
  • WSAEINPROGRESS A blocking Windows Sockets 1.1 operation is in progress.
  • WSAEPROCLIM A limit on the number of tasks supported by the Windows Sockets implementation has been reached.
  • WSAEFAULT The lpWSAData parameter is not a valid pointer.

PM MAIL Skype GTalk   Вверх
lat
Дата 7.4.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



А ошибки как таковой нет  smile 
Просто зависаемс на этом куске и ждем хрен знает чего.
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Alca
Дата 7.4.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



а ты коннекшн закрыл?
shutdown+closesocket

Это сообщение отредактировал(а) Alca - 7.4.2009, 23:31


--------------------
PM WWW ICQ Skype Jabber   Вверх
lat
Дата 8.4.2009, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Alca @ 7.4.2009,  23:21)
а ты коннекшн закрыл?
shutdown+closesocket

Дык дело не доходит до конца функции)
Добавлял и закрытие сокетов, но все равно зависает. Сейчас дебажу на CodeGear (студия сильно капризничать начала), так в нем прога вылетает на вызове ф-и
connect. В дебаге этот кусок просто черная дыра, засосало все, и тупо отдавать не хочет.

делал даже так:

Код

...
    SOCKET sock  = 0; // для гарантии того что нет в нем зла с пред-й "серии" 
    sock = socket(AF_INET, SOCK_STREAM, 0);
...
    closesocket(sock);
    shutdown(sock, 0);
...

ну не может оно подхватывать что то левое из пред вызова  smile  , Я ж вроде зачищаю просто как киллер.
или может?

Это сообщение отредактировал(а) lat - 8.4.2009, 00:45
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Lazin
Дата 8.4.2009, 05:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 5
Всего: 154



Цитата(lat @  7.4.2009,  20:45 Найти цитируемый пост)
В дебаге четко видно, что прога слетает на 
Выделить всёкод C++
1:
    
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);


Цитата(lat @  7.4.2009,  22:13 Найти цитируемый пост)
А ошибки как таковой нет  smile 
Просто зависаемс на этом куске и ждем хрен знает чего. 

ты уж определись...
PM MAIL Skype GTalk   Вверх
Rickert
Дата 8.4.2009, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



lat
Цитата
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);

Как я понял, вы идёте дебагом и при вызове этой строки усё подвисает?
Если так - то тут проблема с VS. ИМХО


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Comm
Дата 8.4.2009, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



Проверьте компьютер на вирусы.
Слышал есть вирус который блокирует все функции WSA,может в этом дело.


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
mrbrooks
Дата 8.4.2009, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: нет
Всего: 306



Цитата(Comm @  8.4.2009,  07:49 Найти цитируемый пост)
Слышал есть вирус который блокирует все функции WSA,может в этом дело. 

однако  smile 

Цитата(lat @  7.4.2009,  20:45 Найти цитируемый пост)
В дебаге четко видно, что прога слетает на 

очень интересно. возникает вопрос - а какой ты хидар подключаешь? winsock.h или winsock2.h?

Цитата(lat @  7.4.2009,  20:45 Найти цитируемый пост)
А в CodeGear - после второй итерации и на том же куске кода

какой второй итерации?  smile 

и так - между делом - как же ты будешь общаться с серваком без send/recive? Или что - достаточно факта коннекта?
PM MAIL   Вверх
Alca
Дата 8.4.2009, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



а в релизе тоже самое?

Добавлено через 1 минуту и 30 секунд
Цитата

после второй итерации и на том же куске кода

Значит первые две отработало...  smile

Добавлено через 3 минуты и 23 секунды
Цитата

Код

    closesocket(sock);
    shutdown(sock, 0);


А если наоборот:
Код

    shutdown(sock, 0);
    closesocket(sock);


Добавлено через 4 минуты и 22 секунды
Код

//--------------------------------------------------------------------------
bool CXClientSocket::bDisconnect() {
    int    iResult = SOCKET_ERROR;

    iResult = ::shutdown(m_puiSocket, SD_BOTH);     
    if (0 != iResult) {    //0 - success
        /*LOG*/LOG_ERROR("shutdown", ::WSAGetLastError());
        return false;
    }
    
    iResult = ::closesocket(m_puiSocket); 
    if (0 != iResult) {    //0 - success
        /*LOG*/LOG_ERROR("closesocket", ::WSAGetLastError());
        return false;
    }    
    m_puiSocket = INVALID_SOCKET;

    return true;
}
//--------------------------------------------------------------------------



--------------------
PM WWW ICQ Skype Jabber   Вверх
Rickert
Дата 8.4.2009, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Сначала идёт shutdown, а потом closesocket()


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
SenkraD
Дата 8.4.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 1
Всего: 23



lat, так вродь косяков не вижу, но может дело из причин, которые ниже:
    - где ждётся завершение потока
    - инициализацию/вуинициализацию Winsock лучше делать раз для все апликухи


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Олег2005
Дата 8.4.2009, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Я всегда советую при работах в каких-то средах никогда не пользоваться для отладки дебагерами - делается код со всеми фиксациями ошибок - и клиент/сервер проверяются только на релизных экзешниках.
Многие среды в дебагере дают и acces violation, и stack overflow и тд.
Это зафиксированный факт - мы заставляем модули стека взаимодействовать со средой - что не есть гуд.
PM MAIL WWW MSN   Вверх
lat
Дата 8.4.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Lazin @  8.4.2009,  05:31 Найти цитируемый пост)
ты уж определись... 

дык если б Я знал...если б Я знал, то сюда не писал бы)

Цитата(Rickert @  8.4.2009,  05:37 Найти цитируемый пост)
Как я понял, вы идёте дебагом и при вызове этой строки усё подвисает?

да, именно так.

Цитата(Rickert @  8.4.2009,  05:37 Найти цитируемый пост)
Если так - то тут проблема с VS. ИМХО 

Тогда и CodeGear включите в список)

Цитата(Comm @  8.4.2009,  07:49 Найти цитируемый пост)
Проверьте компьютер на вирусы.
Слышал есть вирус который блокирует все функции WSA,может в этом дело. 


А Я думал что Я один такой параноик - в хорошем смысле ;)
...запустил аваст на проверку ... подождем результатов)


Цитата(mrbrooks @  8.4.2009,  08:34 Найти цитируемый пост)
winsock.h или winsock2.h?


Пробовал и то и другое - результат тот же.

Цитата(mrbrooks @  8.4.2009,  08:34 Найти цитируемый пост)
какой второй итерации?

через пол часика отпишусь с примером 

Цитата(mrbrooks @  8.4.2009,  08:34 Найти цитируемый пост)
Или что - достаточно факта коннекта? 

ну так!) Это ж пинг типа) Посылка данных пока не нужна.

ЗЫ На остальные вопросы и предложения отпишусь через 30-60 мин (ща нада в магазин сбегать ... хавчик требует что бы его отзавтракали... )


Это сообщение отредактировал(а) lat - 8.4.2009, 11:43
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
lat
Дата 8.4.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Переписал код, добавил: закрытие сокета( спс Alca за предос-й код ),  кетч и решил дебажить по старинке - с помощью логов (спс Олег2005 что заставил вспомнить сей чудесный метод=) 
Также последовал совету увж. SenkraD и сделал одну инициализацию/вуинициализацию.
Код

DWORD WINAPI scanip(LPVOID P) {
    try {
            for (int i = 0; i <= 255; i++) {
                for(int y = 0; y <= 255; y++) {
                    String  ip = "10.62."+IntToStr(i)+"."+IntToStr(y);
                    log("{");
                    log("    IP:"+ip);
                    SOCKET sock      = 0;
                    sock          = socket(AF_INET, SOCK_STREAM, 0);
                    if(sock == INVALID_SOCKET){
                        WSACleanup();
                        log("ERORR:INVALID_SOCKET");
                    }
                    sockaddr_in m_addr;
                    m_addr.sin_family       = AF_INET;
                    m_addr.sin_addr.s_addr = inet_addr(ip.c_str());
                    m_addr.sin_port           = htons(80);
                                   log("connect ...");
                    int iconn = connect(sock, (SOCKADDR*)&m_addr, sizeof(m_addr));
                    if (iconn > 0) {
                        log("    [PING PASSED]");
                        log("}");
                    }else {
                        log("    [PING FAILED]");
                        log("}");
                    }
                    int    iResult = SOCKET_ERROR;
                    iResult = ::shutdown(sock, SD_BOTH);
                    if (0 != iResult) {    //0 - success
                        log("ERORR: shutdown => " + IntToStr(WSAGetLastError()));
                    }

                    iResult = ::closesocket(sock);
                    if (0 != iResult) {    //0 - success
                        log("ERORR: closesocket => " + IntToStr(WSAGetLastError()));
                    }
                }
            }
    }catch(Exception &ex) {
        ShowMessage(ex.ToString());
    }

    return 0;
}

//---------------------------------------------------------------------------
void __fastcall TГлаваМафии::ПогналиClick(TObject *Sender)
{
    WORD    wVersionRequested;
    WSADATA wsaData;
    int    err;

    wVersionRequested = MAKEWORD( 2, 2 );
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
        log("ERORR:WSAStartup error.");
        return;
    }
    if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) {
        WSACleanup( );
        log("ERORR:Sock version error.");
        return;
    }
    DWORD  lpThreadId;
    HANDLE ht = CreateThread(NULL, 0, scanip, LPVOID(0), 0, &lpThreadId);
    CloseHandle(ht);
}


Предоставляю лог:
Код

{
    IP:10.62.0.0
    connect ...
    [PING FAILED]
}
ERORR: shutdown => 10057
{
    IP:10.62.0.1
    connect ...


Четко видно что зависло после вызова ф-и connect.
И почему соб-но 10057 - Сокет не подсоединенный  ???
Как это лечить уважаемые?

Добавлено через 8 минут и 22 секунды
Кстати, тему следовало б переименовать но нет такой возможности )
Глюк этот и без потока наблюдается.  Так что тема "Сокеты и 10057 чертей" пока не закрыта. Ищем решение...
ЗЫ Попробуйте кто-то у себя этот код выполнить, может у меня дейст-но "тазик" шалит.

Это сообщение отредактировал(а) lat - 8.4.2009, 12:53
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Alca
Дата 8.4.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Код

    DWORD  lpThreadId;
    HANDLE ht = CreateThread(NULL, 0, scanip, LPVOID(0), 0, &lpThreadId);
    DWORD Res = WaitForSingleObject( ht, INFINITE);
    CloseHandle(ht);


Добавлено через 4 минуты и 35 секунд
Цитата

    IP:10.62.0.0
connect ...
    [PING FAILED]
}
ERORR: shutdown => 10057
    IP:10.62.0.1
connect ...
    [PING FAILED]
}
ERORR: shutdown => 10057
    IP:10.62.0.2
connect ...
    [PING FAILED]
}
ERORR: shutdown => 10057
    IP:10.62.0.3
connect ...
    [PING FAILED]
}
ERORR: shutdown => 10057
    IP:10.62.0.4
connect ...
    [PING FAILED]
}
ERORR: shutdown => 10057
    IP:10.62.0.5
connect ...




--------------------
PM WWW ICQ Skype Jabber   Вверх
lat
Дата 8.4.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Alca @  8.4.2009,  13:24 Найти цитируемый пост)
DWORD Res = WaitForSingleObject( ht, INFINITE);

И-за этого у меня прога зависает.
Не может она дождаться выхода из потока)


Цитата(Alca @  8.4.2009,  13:24 Найти цитируемый пост)
ERORR: shutdown => 10057
    IP:10.62.0.4
connect ...
    [PING FAILED]
}
ERORR: shutdown => 10057
    IP:10.62.0.5
connect ...

А это у тебя как и у меня, зависает? Или ты просто не стал весь лог выкладывать?

Это сообщение отредактировал(а) lat - 8.4.2009, 13:35
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Alca
Дата 8.4.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Цитата

И-за этого у меня прога зависает.

Сделай консольное приложение

Добавлено через 1 минуту и 24 секунды
Цитата

А это у тебя как и у меня, зависает?

По таймауту connect отключается

Добавлено через 2 минуты и 38 секунд
Цитата

Или ты просто не стал весь лог выкладывать?

6 айпишников просканил, дальше закрыл консоль


--------------------
PM WWW ICQ Skype Jabber   Вверх
Олег2005
Дата 8.4.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



 m_addr.sin_addr.s_addr = inet_addr(ip.c_str());
У меня как-то подозрение на STL-овский стринг.
А почему нельзя для начала сделать без мудростей 

inet_addr("10.0.0.45");
Это раз. 
Второе - файрволл стоит?
У него на 80 порт есть предпочтительные приложения - может на 80 иные не пускать
 Еще:
WSAENOTCONN (10057) Socket is not connected. 
Berkeley description: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket) no address was supplied. 
WinSock description: Same as Berkeley, and then some. An application attempted an input/output network function call before establishing an association with a remote socket (i.e. before calling connect() or accept()). 

Developer suggestions: Chances are, that if you encounter this error, your application ignored the failure of some previous function. Although some WinSock implementations might not issue other errors if a connection fails, so you can handle this error as you would others that indicate connection failure. 

PM MAIL WWW MSN   Вверх
lat
Дата 8.4.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Пора этому жуку уже имя давать, пускай будет "Зависяк" от слова зависание)

Цитата(Олег2005 @  8.4.2009,  14:52 Найти цитируемый пост)
А почему нельзя для начала сделать без мудростей 


Да вроде тоже самое.  Зависяк находит себе логово при вызове ф-и connect. И не важно на какой итерации, бывает что на первой, а бывает что и на 5.


Цитата(Олег2005 @  8.4.2009,  14:52 Найти цитируемый пост)
Второе - файрволл стоит?


Ну если считать стандартный експишный фаервол за фаерволл - тогда стоит. Но хочу заметить что для него это уж сильно "громкое" звание)
Да и вроде не было у этого малыша претензий к мое проге.

Добавлено @ 22:57
Олег2005 Ты гений!

Действительно все приколы и-за 80 - го порта. Если поставить другой, все жуки исчезают)

НО! Как быть если мне нужно найти именно все тачки с 80 - м портом??? 

Задачу не снимаю с повестки дня, заседание продолжается! )))

ЗЫ знаю ведь что копаем в правильном направлении. Еще немного и ...! 
ЗЫЗЫ В конечном итоге ответ может быть банальным, но согласитесь. Весьма интригующим и ожидаемым)

Это сообщение отредактировал(а) lat - 8.4.2009, 23:00
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
lat
Дата 8.4.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Этот фаервол совсем обнаглел. Если указывать в качестве порта например 445 или 135 (ищу виндовые тазики), то снова Зависяк вылазит.
Хочу доброе дело сделать, а мне тут грабли со стороны огненной стены. Ну и как с ним бороться? А может это не и-за фарвола...хз. Но почему то зависает только тогда когда сканируется реально работающий порт.

ЗЫ Я в "печали", а также в злостном дебаге, пора отдохнуть...пойду 22-ю серию героев посмотрю. Сей "свежак" должен поднять мне веки ... и настроение) Жду ваших советов.

Это сообщение отредактировал(а) lat - 8.4.2009, 23:12
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Олег2005
Дата 8.4.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



И так про зависяк.
Если ошибка 10057 - то это не ошибка connect() -  это ошибка send/recv при попытке слать по сокету, который был закрыт (shutdown).
Так что ошибка в логика программы.
теперь здесь 
DWORD Res = WaitForSingleObject( ht, INFINITE);
ht - это у вас дескриптор (handle)
А чего вы от этого хендла ждете то?
Пример:
Here's a bare bones example of using WaitForSingleObject with a thread handle.
Код

#include <windows.h>
#include <tchar.h>
// global thread id
static DWORD g_tid = 0;
DWORD WINAPI ThreadFunction(LPVOID lpParameter)
{
   // without this we can not exit msgloop
   g_tid = GetCurrentThreadId();
   // do stuff - eg. start a msgloop
   return 0;
}

// ---------------------------------------------------------------------------

int main(void)
{
   DWORD dwThread, exThread;
   // CreateThreadEx
   HANDLE hThread = CreateThread(NULL, (DWORD)NULL,
            (LPTHREAD_START_ROUTINE)ThreadFunction,
            (LPVOID) NULL, (DWORD)NULL, &dwThread);
   // suspend main thread until new thread completes
   WaitForSingleObject(hThread,INFINITE);
   // examine create thread response
   if ( !GetExitCodeThread(hThread, &exThread) ) {
      printf(_T("GetExitCodeThread %08X\n"),GetLastError());
   }
   // close thread handle
   CloseHandle(hThread);
   return 0;
}


A thread signals when it finishes execution. Signal states are managed by the operating system, it's not a good idea to attempt to manipulate them directly. A SetEvent/ResetEvent pair sounds like a good starting point.

Это сообщение отредактировал(а) Олег2005 - 8.4.2009, 23:15
PM MAIL WWW MSN   Вверх
lat
Дата 8.4.2009, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Олег2005 @  8.4.2009,  23:13 Найти цитируемый пост)
это ошибка send/recv при попытке слать по сокету, который был закрыт


Хм. Любопытно. А соб-но не было разрывов то)
Не было ни отправки ни считывания данных из сокета. Откуда тогда такая ошибка?)

Цитата(Олег2005 @  8.4.2009,  23:13 Найти цитируемый пост)
А чего вы от этого хендла ждете то?


Да это мне Alca дал код, а Я сразу так не подумавши и впихнул его (вот так кстати получаются иногда не только ошибки но и .... =)

Раньше без ожидания все было, мне пока незачем ждать завершения потока.

Цитата(Олег2005 @  8.4.2009,  23:13 Найти цитируемый пост)
Так что ошибка в логика программы.

Помогите найти) Вроде ж кода немного.

Вот последняя моя редакция - место обитания Косяка)
Код

DWORD WINAPI scanip(LPVOID P) {
    try {
            for (int i = 0; i <= 255; i++) {
                for(int y = 0; y <= 255; y++) {
                    String  ip = "192.168."+IntToStr(i)+"."+IntToStr(y);
                    log("{");
                    log("    IP:"+ip);
                    SOCKET sock      = 0;
                    sock          = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
                    if(sock == INVALID_SOCKET){
                        WSACleanup();
                        log("ERORR:INVALID_SOCKET");
                    }
                    sockaddr_in m_addr;
                    m_addr.sin_family       = AF_INET;
                    char *pIP               = ip.c_str();
                    m_addr.sin_addr.s_addr = inet_addr(pIP);
                    m_addr.sin_port           = htons(445);
                    log("    connect ...");
                    int iconn = connect(sock, (SOCKADDR*)&m_addr, sizeof(m_addr));
                    if (iconn > 0) {
                        log("    [PING PASSED]");
                        log("}");
                    }else {
                        log("    [PING FAILED]");
                        log("}");
                    }
                    int    iResult = SOCKET_ERROR;
                    iResult = ::shutdown(sock, SD_BOTH);
                    if (0 != iResult) {    //0 - success
                        log("ERORR: shutdown => " + IntToStr(WSAGetLastError()));
                    }

                    iResult = ::closesocket(sock);
                    if (0 != iResult) {    //0 - success
                        log("ERORR: closesocket => " + IntToStr(WSAGetLastError()));
                    }
                }
            }
    }catch(Exception &ex) {
        ShowMessage(ex.ToString());
    }

    return 0;
}

//---------------------------------------------------------------------------
void __fastcall TКтулху::МоскClick(TObject *Sender)
{
    WORD    wVersionRequested;
    WSADATA wsaData;
    int    err;

    wVersionRequested = MAKEWORD( 2, 2 );
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
        log("ERORR:WSAStartup error.");
        return;
    }
    if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) {
        WSACleanup( );
        log("ERORR:Sock version error.");
        return;
    }
    DWORD  lpThreadId;
    HANDLE ht = CreateThread(NULL, 0, scanip, LPVOID(0), 0, &lpThreadId);
    //DWORD Res = WaitForSingleObject( ht, INFINITE);
    CloseHandle(ht);
}


Это сообщение отредактировал(а) lat - 8.4.2009, 23:36
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Alca
Дата 8.4.2009, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Код

void __fastcall TКтулху::МоскClick(TObject *Sender)
{
    WORD    wVersionRequested;
    WSADATA wsaData;
    int    err;
    //...
}

А ничего страшного, что этот код находиться в блоке????

Добавлено @ 23:47
Как ты думаешь , что произойдет сним после выхода из этого блока????  smile 
Что произойдет с локальными переменными?

Добавлено @ 23:48
Если так
Код

    HANDLE ht = CreateThread(NULL, 0, scanip, LPVOID(0), 0, &lpThreadId); 
    //DWORD Res = WaitForSingleObject( ht, INFINITE);
    CloseHandle(ht);

то лучше уже так:
Код

    static HANDLE ht = CreateThread(NULL, 0, scanip, LPVOID(0), 0, &lpThreadId);  //или сделать глобально
    //DWORD Res = WaitForSingleObject( ht, INFINITE);
    //CloseHandle(ht);

Но хендл потока надо закрывать.

Это сообщение отредактировал(а) Alca - 8.4.2009, 23:50


--------------------
PM WWW ICQ Skype Jabber   Вверх
lat
Дата 9.4.2009, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Alca @  8.4.2009,  23:45 Найти цитируемый пост)
А ничего страшного, что этот код находиться в блоке????


Так это переменные для инициализации библиотеки Ws2_32.dll. В потоке они не используются. 

Цитата(Alca @  8.4.2009,  23:45 Найти цитируемый пост)
Но хендл потока надо закрывать.


Так в чем вопрос)
Я его и закрываю то " CloseHandle(ht);". Мне не нужно ждать завершения потока. Можно даже так сделать: 
Код

CreateThread(NULL, 0, scanip, LPVOID(0), 0, &lpThreadId); 

Результат от такой рокировки не изменится.

Сейчас задача несколько другая - решить глюк с Зависяком.  

Это сообщение отредактировал(а) lat - 9.4.2009, 00:36
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Alca
Дата 9.4.2009, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Цитата

Так это переменные для инициализации библиотеки Ws2_32.dll

А зачем их инициализировать если они автоматом разрушаются???


--------------------
PM WWW ICQ Skype Jabber   Вверх
lat
Дата 9.4.2009, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Alca @  9.4.2009,  00:47 Найти цитируемый пост)
А зачем их инициализировать если они автоматом разрушаются??? 


Автоматом, это как?
Должны только после "WSACleanup();" )

Добавлено @ 01:24

Как урезать таймауты на соединение?
 
Оказывается висяка нет, просто соединение долго устанавливается. 
Код

int iconn = connect(sock, (SOCKADDR*)&m_addr, sizeof(m_addr)); // здесь нужно урезать таймаут до 1 сек. Ну или меньше.



Это сообщение отредактировал(а) lat - 9.4.2009, 01:46
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
lat
Дата 9.4.2009, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



+ hot fix !!!
Код

...
if (iconn == 0) {
 log("    [PING PASSED]");
 log("}");
}else {
...




Это сообщение отредактировал(а) lat - 9.4.2009, 01:34
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
lat
Дата 9.4.2009, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



немного погуглил.
У меня сложились такие выводы:
1. Если уменьшить таминг - это не есть гут. Так как нет 100% гарантии что хост успеет "ответить".
2. Единств-м решением пинга через сокеты, это увлечения скорости за счет многоза-ти.
3. Намного быстрее для пинга использовать АРП запросы.
4. Учим матчасть)

ЗЫ Своим ночным монологом Я почти все разобрал по полочкам. Тема на грани закрытия)
ЗЫЗЫ Если кто знает как уменьшить таймаут без потерь, буду только рад это увидеть. Пишите сюда!)


Это сообщение отредактировал(а) lat - 9.4.2009, 02:46
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Олег2005
Дата 9.4.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Во первых, это неверно.
Вы не закрыли сокет - а выгрузили все библиотеки 
if(sock == INVALID_SOCKET){
                        WSACleanup();
                        log("ERORR:INVALID_SOCKET");
                    }
Это в данном случае не причина скорее всего, но так не делают
Далее
445 порт на виндовской машине занят виндовской службой
Это используют вирусы - вы случайно не его пишете?
"Randon" распространяется по IRC-каналам и ресурсам локальных сетей и заражает компьютеры под управлением операционных систем Windows 2000 и Windows XP. Для проникновения на компьютер он подключается к IRC-серверу (или локальной сети), сканирует находящихся на нем пользователей, устанавливает с ними соединение по порту 445 и пытается подобрать пароль из встроенного списка наиболее часто используемых фраз. В случае успешного взлома системы "Randon" пересылает на нее троянскую программу "Apher"

PM MAIL WWW MSN   Вверх
lat
Дата 10.4.2009, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 14.1.2008

Репутация: нет
Всего: 1



Цитата(Олег2005 @  9.4.2009,  21:43 Найти цитируемый пост)
Во первых, это неверно.

Как то уж сильно категорично, но Я Вам верю.

Цитата(Олег2005 @  9.4.2009,  21:43 Найти цитируемый пост)
Это в данном случае не причина скорее всего, но так не делают

Так причину нашол уже, таймауты урезать нужно. Они там по дефолту от 3 до 10 сек. В зависимости от сети. Читайте мой пред. пост.

Цитата(Олег2005 @  9.4.2009,  21:43 Найти цитируемый пост)
Это используют вирусы - вы случайно не его пишете?


Если б и писал то не вирусы, а исключительно червяков. Которые деструктивного ничего не делали б, а просто выводили сообщение типа "Посади дерево, вырости сына и снеси нахрен бетонный дом и построй избушку в лесу!" (да даже это  и то мне не очень интересно, Я свою точку мнения не люблю навязывать другим.  У каждого своя голова, пускай сам решает как ему жить. А вот если попросят помощи, то - помогу.). В общим цель у меня мирная, пишу сканер для локальной сети, что ж Я виноват что винду только по этим портам определить можно.  smile 

Цитата(Олег2005 @  9.4.2009,  21:43 Найти цитируемый пост)
"Randon"


))) 
Приятно что Вы так об бо мне думаете, но мой моск еще не созрел для такого. А когда созреет, то лишь для локальных тестов smile






Это сообщение отредактировал(а) lat - 10.4.2009, 00:58
--------------------
Gott weiß ich will kein Engel sein
PM ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1425 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.