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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Время соединения 
:(
    Опции темы
alligator
Дата 15.7.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет с С++ работаю недавно в основном писал на PHP , но сейчас очень сильно понадобилось сделать маленькую софтинку под unix
задача программы подключиться в указанному хосту и порту и вернуть время за которое произошло соединение и если недоступен возвращает false.
 почти аналог ping только на определенный порт..... 
подскажите пожалуйста как лучше реализовать....  

Это сообщение отредактировал(а) alligator - 15.7.2006, 11:18
PM MAIL   Вверх
alligator
Дата 15.7.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Такая функция реализована в proxy чекерах 
PM MAIL   Вверх
GrayCardinal
Дата 16.7.2006, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

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



Код

/*
 * (c) Oleg Puchinin 2006
 * [email protected]
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <time.h>

struct timeval * cur_tv = NULL;

void Dtimer ()
{
    if (! cur_tv)
        cur_tv = new timeval;
    gettimeofday(cur_tv, NULL);
}

struct timeval *the_time ()
{
    timeval new_tv;

    if (cur_tv == NULL)
        return NULL;
    gettimeofday (&new_tv, NULL);
    cur_tv->tv_sec = new_tv.tv_sec - cur_tv->tv_sec;
    if (new_tv.tv_usec >= cur_tv->tv_usec)
        cur_tv->tv_usec = new_tv.tv_usec - cur_tv->tv_usec;
    else {
        cur_tv->tv_sec--;
        cur_tv->tv_usec = cur_tv->tv_usec - new_tv.tv_usec;
    }

    return cur_tv;
}

void print_the_time (FILE * file_my)
{
    if (the_time ()) {
        if (file_my)
            fprintf (file_my, "The time : %i.%06i\n",
                    cur_tv->tv_sec, cur_tv->tv_usec);
        else
            printf ("The time : %i.%06i\n", (int) cur_tv->tv_sec, (int) cur_tv->tv_usec);
    }
}

void usage ()
{
    printf ("usage: tcpping <IP> <PORT>\n");
}

int main (int argc, char ** argv)
{
    struct sockaddr_in addr;
    int fd;

    if (argc < 2) {
        usage ();
        return 1;
    }
    
    fd = socket (AF_INET, SOCK_STREAM, 0);
    if (fd < 0)
        return 2;

    bzero (&addr, sizeof (struct sockaddr_in));
    inet_aton (argv[1], &addr.sin_addr);
    addr.sin_port = htons (atoi (argv[2]));
    addr.sin_family = AF_INET;
    
    Dtimer ();
    if (connect (fd, (struct sockaddr *) &addr, sizeof (struct sockaddr_in)) < 0)
        return 0; // Vernut' resultat - net konnekta 
    
    print_the_time (stdout);
    return 3;
}

Первый аргумент - IP, второй порт. Коннекта нет - возвращает ноль. 
 


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


Опытный
**


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

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



Спасибо буду разбираться.... 
Надо только подправить чтобы возвращал значение не в микросекундах а мили 

Это сообщение отредактировал(а) alligator - 16.7.2006, 10:55
PM MAIL   Вверх
bilbobagginz
Дата 21.7.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



Если тебе НЕ нужна точность в микросекундах, то по-моему намного проще использовать netcat (в некоторых дистрах - nc ), запустить через time. если она вернёт не 0, значит не получилось подключитья. переменная errno скажет почему. если да, то запарсить время получишь как долго всё заняло.

или просто: http://www.linuxco.de/tcping/tcping.html

а если тебе нужна точность до микросекунд ( по TCP соединению ), то может стоит обратиться к библиотекам group communication, напр. MPI, jazz-ensemble и т.д.

пока. 


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




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


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

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