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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать занет ли удалённый порт? 
V
    Опции темы
Феликс
Дата 5.7.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Rickert @ 5.7.2007,  09:24)
Цитата(Феликс @  5.7.2007,  09:10 Найти цитируемый пост)
P.S: Не предлагать почитай это почитай то.

Так может тебе и порграмму ещё написать? Сам не знаешь что пишешь и ещё читать ничего не хочешь. Ищи джина, чтобы он тебе по воле твоей писал программы. Лентяй smile

Харэ набивать себе посты! Лучше бы помог! А то тока ля ля да ля ля.
PM   Вверх
ptr
Дата 5.7.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 14



Феликс, показывай код.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Феликс
Дата 5.7.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вотъ... реализовал при помощи таймера, но есть проблемы smile 
Код

UINT CLauncherDlg::StatusThread(LPVOID param) {
    THREADSTRUCT*    ts = (THREADSTRUCT*)param;
    ts->_this->ServerConnect();
return 1;
}

void CLauncherDlg::OnTimer(UINT nIDEvent)
{
    THREADSTRUCT *_param = new THREADSTRUCT;
    _param->_this = this;
    AfxBeginThread (StatusThread, _param);
    CDialog::OnTimer(nIDEvent);
}

int CLauncherDlg::ServerConnect() {

    struct sockaddr_in sock_addr;
    SOCKET Sock;
    WSAData WSADat;
    WSAStartup(0x0202, &WSADat);
    ZeroMemory( &sock_addr, sizeof(sock_addr) );

    sock_addr.sin_family = AF_INET;
    sock_addr.sin_port = htons (PORT);    
    sock_addr.sin_addr.S_un.S_addr = inet_addr(IP);    
    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    int RSock = connect(Sock, (sockaddr *)&sock_addr, sizeof (sockaddr));
    if(RSock == 0) { m_status.SetWindowTextA("Online"); } else { m_status.SetWindowTextA("Offline"); }
    return RSock;
    WSACleanup();
}

int CLauncherDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    SetTimer(IDT_TIMER, 1000 , NULL); 
    if (CDialog::OnCreate(lpCreateStruct) == -1) return -1;
    return 0;
}


Работает так как хотелось, но заметил что в памяти, программа начинает расти. По идей тут гдето надо закрывать поток после каждой проверки. Помогите пожалуйста, заранее спасибо!


Это сообщение отредактировал(а) Феликс - 5.7.2007, 16:01
PM   Вверх
ptr
Дата 5.7.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 14



1. Зачем каждый раз инициализировать winsock? Сделай WSAStartup один раз.
2. 
Код

    return RSock;
    WSACleanup();

Здесь видимо должно быть наоборот. И учитывая предыдущее убери его куда-нибудь в другое место.
3. Sock надо бы в конце закрывать.
4. В OnTimer неплохо бы каждый раз проверять нет ли других потоков, которые были порождены раньше (например флажком).
Цитата(Феликс @  5.7.2007,  19:00 Найти цитируемый пост)
По идей тут гдето надо закрывать поток после каждой проверки.

Поток сам завершится при выходе из функции.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Феликс
Дата 5.7.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



#Ptr, спасибо за советы, всё раставил на свои места и даже нашел причину, почему в памати программа начинает расти.
Ниже часть кода после наработок:
Код

UINT CLauncherDlg::StatusThread(LPVOID param) {
    THREADSTRUCT*    ts = (THREADSTRUCT*)param;
    ts->_this->ServerConnect();
return 1;
}

int CLauncherDlg::ServerConnect() {
    struct sockaddr_in sock_addr;
    SOCKET Sock;
    ZeroMemory( &sock_addr, sizeof(sock_addr) );
    sock_addr.sin_family = AF_INET;
    sock_addr.sin_port = htons (PORT);    
    sock_addr.sin_addr.S_un.S_addr = inet_addr(IP);    
    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    int RSock = connect(Sock, (sockaddr *)&sock_addr, sizeof (sockaddr));
    closesocket(Sock);

    if(RSock == 0) { m_status.SetWindowText("Online"); } else { m_status.SetWindowText("Offline"); }
    
    ServerConnect();
    return RSock;
}

Всё работает как надо кроме того что память забивается, в особености процесс ускоряется когда порт занет.
Причина вот в этих строках:
Код

    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    int RSock = connect(Sock, (sockaddr *)&sock_addr, sizeof (sockaddr));

Помогите! как исправить!?

+ Как проверить если уже создан поток и как его закрывать?

Это сообщение отредактировал(а) Феликс - 5.7.2007, 23:16
PM   Вверх
witex
Дата 6.7.2007, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



птр, зря ты написал WSACleanup() после ретурна, так как процедура очитки не выполнится! Так как поток сразу с ретурном подпрограмма закрывается! ваабще я бы предложил не использовать таймер! 
Это каждый раз, отрывать новый поток. Лудше запусти поток при включении проги, и больше и поставь цикл на connect, и просто поставь там sleep(); там уже решишь сколько тебе надо времени поспать!
примерно вот так!
Код


int CLauncherDlg::ServerConnect() {
    struct sockaddr_in sock_addr;
    SOCKET Sock;
    ZeroMemory( &sock_addr, sizeof(sock_addr) );
    sock_addr.sin_family = AF_INET;
    sock_addr.sin_port = htons (PORT);    
    sock_addr.sin_addr.S_un.S_addr = inet_addr(IP);    
    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    while(true)
{
    int RSock = connect(Sock, (sockaddr *)&sock_addr, sizeof (sockaddr));
   
    if(RSock == 0) { m_status.SetWindowText("Online"); } else { m_status.SetWindowText("Offline"); }
sleep(60000);// раз в секунду будет объявлятся цикл  
}  
    closesocket(Sock);
    return RSock;
}



Да а память у тебя чётко жрёт из-за рекурсии. потому что процедура ни когда не закрывается!
так что тебе достаточно один раз запустить поток вот и всё.
У тебя то и твой поток из-за рекурсии не закрывался!
Если оставить твой код, то стоит сделать так!
Код

UINT CLauncherDlg::StatusThread(LPVOID param) {
    THREADSTRUCT*    ts = (THREADSTRUCT*)param;
    ts->_this->ServerConnect();
    delete ts;//освобождаем память! потому что память которую ты выделил под указатель ты не освобождаешь
return 1;
}

int CLauncherDlg::ServerConnect() {
    struct sockaddr_in sock_addr;
    SOCKET Sock;
    ZeroMemory( &sock_addr, sizeof(sock_addr) );
    sock_addr.sin_family = AF_INET;
    sock_addr.sin_port = htons (PORT);    
    sock_addr.sin_addr.S_un.S_addr = inet_addr(IP);    
    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    int RSock = connect(Sock, (sockaddr *)&sock_addr, sizeof (sockaddr));
    closesocket(Sock);

    if(RSock == 0) { m_status.SetWindowText("Online"); } else { m_status.SetWindowText("Offline"); }
    
    // ServerConnect();//а тут у тебя рекурсия, которая с гиганской скоростю жрёт память. 
    return RSock;
}

Всё, вроде отписался=))
З.Ы.  smile Привет всем=) Давно не заходил сюда чёта=))
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
ptr
Дата 6.7.2007, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 14



Цитата(witex @  6.7.2007,  05:10 Найти цитируемый пост)
птр, зря ты написал WSACleanup() после ретурна

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


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
witex
Дата 6.7.2007, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ясно.
Короче феликс, проверь и отпишись!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
Феликс
Дата 6.7.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



#Witex
Спасибо! Сделал вот так:
Код

void CLauncherDlg::ServerConnect() {
    struct sockaddr_in sock_addr;
    SOCKET Sock;
    int RSock;
    ZeroMemory(&sock_addr, sizeof(sock_addr));
    sock_addr.sin_family = AF_INET;
    sock_addr.sin_port = htons (PORT);    
    sock_addr.sin_addr.S_un.S_addr = inet_addr(IP);    

    while(TRUE) {
        Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        RSock = connect(Sock, (sockaddr *)&sock_addr, sizeof (sockaddr));
        if(RSock == 0) { m_status.SetWindowText("Online"); } else { m_status.SetWindowText("Offline"); }
        closesocket(Sock);
        Sleep(3000);
    }
}

Работает!   smile 
Всем спасибо! 

P.S: Помогите вот еще по этой теме http://forum.vingrad.ru/forum/topic-162255...troywindow.html
 Заранее спасибо!

Это сообщение отредактировал(а) Феликс - 6.7.2007, 08:54
PM   Вверх
witex
Дата 6.7.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да по этой теме, совет. Заведи какуюнить глобальную переменную буул. И допусти если она true. То цикл обрывается. Это лудше будет для программы. При загрытии проги переменную меняешь, и сразу цикл тогда закроется!
а в цикле споставь if на неё, и если true выполнишь break;
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
Феликс
Дата 6.7.2007, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(witex @ 6.7.2007,  10:47)
Да по этой теме, совет. Заведи какуюнить глобальную переменную буул. И допусти если она true. То цикл обрывается. Это лудше будет для программы. При загрытии проги переменную меняешь, и сразу цикл тогда закроется!
а в цикле споставь if на неё, и если true выполнишь break;

Спасибо за совет.
Сделал так: 
Создал глобальную переменую типа BOOL. В цыкле ставлю проверку while(StatusFlag == TRUE) { ... }, а призакрытии StatusFlag = FALSE;
Правельно?
PM   Вверх
witex
Дата 6.7.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Совершенно верно
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
witex
Дата 6.7.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Феликс, раз всё решили проблему, закрывай тему!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
Феликс
Дата 6.7.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(witex @ 6.7.2007,  13:11)
Феликс, раз всё решили проблему, закрывай тему!

Эмммм... а как это мне сделать. Вроде нигде не видел кнопки по закрытию темы.
PM   Вверх
ptr
Дата 6.7.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 14



Цитата(witex @  6.7.2007,  13:47 Найти цитируемый пост)
 Заведи какуюнить глобальную переменную буул.

Доступ к ней надо бы синхронизовать.

Это сообщение отредактировал(а) ptr - 6.7.2007, 15:19


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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