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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сокеты и поток. Есть ли дружба между ними? ошибка при инициализации сокета 
:(
    Опции темы
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   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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