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

Поиск:

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


Шустрый
*


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

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



Как узнать занет ли удалённый порт? Вотъ код, возращает 1 если порт занет и 0 в ином случае.
Код

int CLauncherDlg::ServerConnect() {

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

    sock_addr.sin_family = AF_INET;    
    sock_addr.sin_port = htons (80);    
    sock_addr.sin_addr.s_addr = inet_addr("195.26.135.8");    
    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if(bind(Sock, (sockaddr *)&sock_addr, sizeof (sockaddr)) == SOCKET_ERROR) {    
        WSACleanup();        
        return 1;    
    } else { return 0; }
}

Для localhost всё отлично работает! А вот для другой удалённой машины нет. В чём ошибка? Помогите! Заранее спасибо! 
P.S: Не предлагать почитай это почитай то.

Это сообщение отредактировал(а) Феликс - 3.7.2007, 00:06
PM   Вверх
MaXL
Дата 3.7.2007, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



а что если убрать вот эту строчку? ведь по сути она здесь совершенно не к чему.
Код

sock_addr.sin_addr.s_addr = inet_addr("195.26.135.8");  



--------------------
MaXL
PM MAIL   Вверх
Феликс
Дата 3.7.2007, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(MaXL @ 3.7.2007,  07:49)
а что если убрать вот эту строчку? ведь по сути она здесь совершенно не к чему.
Код

sock_addr.sin_addr.s_addr = inet_addr("195.26.135.8");  

Откуда программа будет знать, к какому хосту подключаться для проверки занетости порта?
PM   Вверх
MaXL
Дата 3.7.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Феликс, аха=))) я когда прочитал название темы сразу так и подумал что программа должно подключаться, и проверять порт на занятость. Потом посмотрел исходник, и подумал что ты будешь запускать прогу, она будет пытаться забандить порт, и если удалдось то OK иначе !Ok=)
Вот скорее всего так должно работать.
Код

int CLauncherDlg::ServerConnect() {
    struct sockaddr_in sock_addr;
    SOCKET Sock;
    WSAData WSADat;
    WSAStartup(0x0202, &WSADat);
    sock_addr.sin_family = AF_INET;    
    sock_addr.sin_port = htons (80);    
    sock_addr.sin_addr.s_addr = inet_addr("195.26.135.8");    
    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   
    if(connect(Sock, (sockaddr *)&sock_addr, sizeof (sockaddr)) == SOCKET_ERROR) {    
        WSACleanup();        
        return 1;    
    } else { return 0; }
}

Код

P.S: Не предлагать почитай это почитай то.

А надо бы ;-)


--------------------
MaXL
PM MAIL   Вверх
Феликс
Дата 3.7.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо за помощь! Помогло! Тему можно закрывать!

Добавлено через 14 минут и 21 секунду
Хотя еще один маленкий вопрос по теме появился. Вот я установил на форме статический элемент уведомляющий о статусе порта. Хотелось бы чтобы форма автоматически меняла текст в статическом элементе при смене статуса порта. Как реализовать? Заранее спасибо!
PM   Вверх
MaXL
Дата 4.7.2007, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



А что значит статический элемент? Я так подозреваю что надпись с текстом? Если так то используй SetWindowText
Примерно вот так:
Код

//в StatusLabel у тебя хэндл твоего статического элемента.
SetWindowText(StatusLabel, "OK");

P.S. один топик один вопрос!



--------------------
MaXL
PM MAIL   Вверх
Феликс
Дата 4.7.2007, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(MaXL @ 4.7.2007,  04:34)
А что значит статический элемент? Я так подозреваю что надпись с текстом? Если так то используй SetWindowText
Примерно вот так:
Код

//в StatusLabel у тебя хэндл твоего статического элемента.
SetWindowText(StatusLabel, "OK");

P.S. один топик один вопрос!

Нет, ты меня не понял. Мне не просто надо добавить статус в текстовый элемент, а чтобы программа автоматически обновляла информацию в текстовом элементе о статусе порта.
PM   Вверх
MaXL
Дата 4.7.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Феликс, ну так вместе в том месте где ты используешь свою функции сделай вот так:
Код

if(!ServerConnect()) SetWindowText(StatusLabel, "Busy");
else SetWindowText(StatusLabel, "Free");

вот скорее всего так.
Код

Нет, ты меня не понял.

ага, я тебе и сейчас не до конца понимаю=)


--------------------
MaXL
PM MAIL   Вверх
Феликс
Дата 4.7.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сейчас у меня так и написано, но не искомый эффект.
Допустим, запускаем программу на проверку свободности порта, программа указывает что порт занет, теперь допустим что в какойта момент порт освободился, вот теперь без лишних движений программа сама должна зафиксировать что порт освободился. 
P.S: Всё время пока идёт изменение статуса порта программа работает! Проверка порта идёт в отдельном потоке. 
PM   Вверх
MaXL
Дата 4.7.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


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

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



Цитата(Феликс @  5.7.2007,  00:00 Найти цитируемый пост)
вот теперь без лишних движений программа сама должна зафиксировать что порт освободился. 

я тебя если чесно не до конца понимаю, что значит  без лишних движений? Может быть нужно обновить окно? тогда UpdateWindow(хэндл_окна);
Если не так, то пиши подробнее, да и вообще это раздел СЕТИ, за такое можно получить по шапке от модератора.


--------------------
MaXL
PM MAIL   Вверх
amplua
Дата 4.7.2007, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Один вариант так
Код

int CLauncherDlg::ServerConnect() {    
    struct sockaddr_in sock_addr;    
    SOCKET Sock;    
    WSAData WSADat;    
    WSAStartup(0x0202, &WSADat);    
    sock_addr.sin_family = AF_INET;     
    sock_addr.sin_port = htons (80);     
    sock_addr.sin_addr.s_addr = inet_addr("195.26.135.8");     
    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    
    if(connect(Sock, (sockaddr *)&sock_addr, sizeof (sockaddr)) == SOCKET_ERROR) {     
        WSACleanup();         
        return 1;     
    } else { return 0; }    
//посмотрите 
ServerConnect();
}


второй вариант исползование таймер. Заданный время запускает ServerConnect().
PM MAIL   Вверх
Феликс
Дата 5.7.2007, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(amplua @ 4.7.2007,  20:54)
Один вариант так
Код

int CLauncherDlg::ServerConnect() {    
    struct sockaddr_in sock_addr;    
    SOCKET Sock;    
    WSAData WSADat;    
    WSAStartup(0x0202, &WSADat);    
    sock_addr.sin_family = AF_INET;     
    sock_addr.sin_port = htons (80);     
    sock_addr.sin_addr.s_addr = inet_addr("195.26.135.8");     
    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    
    if(connect(Sock, (sockaddr *)&sock_addr, sizeof (sockaddr)) == SOCKET_ERROR) {     
        WSACleanup();         
        return 1;     
    } else { return 0; }    
//посмотрите 
ServerConnect();
}


Не работает! Хотя на первый взгляд должен. Может из-за того что проверка статуса порта у меня идёт в отдельном потоке?

Добавлено через 3 минуты и 22 секунды
Не даже вне потока не работает!
PM   Вверх
Rickert
Дата 5.7.2007, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Феликс, в чём проблема? Тебе уже дали все ответы, хоть ты даже и не понимаешь что пишешь вообще.
В своём первом коде, ты пытался забиндиться на порт. Читаем мануал с большими каритнками:
Цитата
Код
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd , struct sockaddr * my_addr , socklen_t addrlen );

Описание
bind привязывает к сокету sockfd локальный адрес my_addr длиной addrlen . Традиционно, эта операция называется "присваивание сокету имени". Когда сокет только что создан с помощью socket(), он существует в пространстве имён (семействе адресов), но не имеет назначенного имени. 

Ferstein?
Ты пытался биндиться на нелокальный хост - соответственно получал по шапке.
Теперь про то непонятное, что ты просишь о статусе.
Верно ли, что: у тебя в потоке постоянно крутиться функция, которая проверяет статус открыт / заркты ли порт и тебе надо, в зависимоти от результата менять статус?
Если да - то все ответы тебе уже дали.

Добавлено @ 04:49
Перечитай внимательно...

Это сообщение отредактировал(а) Rickert - 5.7.2007, 04:49


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


Шустрый
*


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

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



Цитата(Rickert @ 5.7.2007,  04:49)
Феликс, в чём проблема? Тебе уже дали все ответы, хоть ты даже и не понимаешь что пишешь вообще.
В своём первом коде, ты пытался забиндиться на порт. Читаем мануал с большими каритнками:
Цитата
Код
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd , struct sockaddr * my_addr , socklen_t addrlen );

Описание
bind привязывает к сокету sockfd локальный адрес my_addr длиной addrlen . Традиционно, эта операция называется "присваивание сокету имени". Когда сокет только что создан с помощью socket(), он существует в пространстве имён (семействе адресов), но не имеет назначенного имени. 

Ferstein?

Читай в первом посту что написано!
P.S: Не предлагать почитай это почитай то.

Добавлено через 1 минуту и 23 секунды
Цитата(Rickert @ 5.7.2007,  04:49)
Верно ли, что: у тебя в потоке постоянно крутиться функция, которая проверяет статус открыт / заркты ли порт и тебе надо, в зависимоти от результата менять статус?
Если да - то все ответы тебе уже дали.

Вот имено что функция крутиться в потоке, но искомого эффекта нет и это факт.
PM   Вверх
Rickert
Дата 5.7.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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