просмотр порта\сокета

Модератор: Модераторы разделов

warp
Сообщения: 135

просмотр порта\сокета

Сообщение warp »

вот начал баловаться с сетевыми програмками и тут стал вопрос - как их проконтролировать?
то есть можно ли просмотреть открытые порты или этот подход не верен? как ещё можно посмотреть чем занимаеться прога в сети?
за мировое господство! банзай, товарищи!
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: просмотр порта\сокета

Сообщение Voice »

netstat, tcpdump, telnet (для "общения" с программой).
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: просмотр порта\сокета

Сообщение Zeus »

nc
Спасибо сказали:
warp
Сообщения: 135

Re: просмотр порта\сокета

Сообщение warp »

ах да! я забыл самое главное - я пытаюсь их писать. )) оно мне просто казалось на столько само собой разумеющиеся что я даже не подумал об этом написать.

я сделал нечто работой чего хочу полюбоваться.

Код: Выделить всё

#include <iostream.h>
#include <sys/socket.h>

main()
{
   int socket_dis = socket(PF_INET, SOCK_STREAM, 0);

   char xxx[128];
   cin >> xxx;

   close (socket_dis);

   return 0;
}

естественно sin >> xxx нужно для того чтобы успеть посмотреть что там у меня программа делает. но тут небольшая загводка как это сделать?
посмотрел в ps нашёл вот это
warp 10492 0.0 0.0 2524 580 pts/1 S+ 19:32 0:00 ./a.out
затем сделал вот такое тело движение
netstat -p 10492
но у меня вывались ну очень неприличное колличество строк, тогда как мне надо что бы было только по 10492. ну собственно и сам вопрос - можно ли это сделать и если да то как?
за мировое господство! банзай, товарищи!
Спасибо сказали:
warp
Сообщения: 135

Re: просмотр порта\сокета

Сообщение warp »

что то я совсем с опциями netstat'a замудрил. будем считать что последнии два предложения написали иноплонетяни.
за мировое господство! банзай, товарищи!
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: просмотр порта\сокета

Сообщение AestheteAnimus »

warp писал(а):
05.09.2008 21:50
ах да! я забыл самое главное - я пытаюсь их писать.

Читать Стивенса :)

warp писал(а):
05.09.2008 21:58
что то я совсем с опциями netstat'a замудрил. будем считать что последнии два предложения написали иноплонетяни.

И это описано у стивенса ;)
А вообще, можно сделать так:
netstat -na | grep tcp
Спасибо сказали:
warp
Сообщения: 135

Re: просмотр порта\сокета

Сообщение warp »

thx, AestheteAnimus!
почитал Стивенса, вроде дело пишет мужик, но unp.h к пониманияю не приблежает - всё нужно скрыть и как можно скорее вылить материал на читателя... а мне разобраться хочеться. так что я тут немного всё перекрутил и получилось вот такое вот вояние. помогите заставит работать. :]

в коментах оригинал программы без контроля ошибок и прочего - просто чтоб работала. все что идёт через пустую строку после закоменченных строк для удобства отладки. в моём случае программа останавливается на

Код: Выделить всё

bash-3.1$ ./a.out
Socket_D: 4
inet_pton: 1
//пустая строка собственной персоной. лечиться cntrl + c


Код: Выделить всё

#include <iostream.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
   int Socket_D = socket(AF_INET, SOCK_STREAM, 0), count;
   cout << "Socket_D: " << Socket_D << endl;
   char inet_addr[] = "206.62.226.35";

   struct sockaddr_in st_SockAddr;
   memset(&st_SockAddr, 0, sizeof(st_SockAddr));

   st_SockAddr.sin_family = AF_INET;
   st_SockAddr.sin_port = htons(13);
   //inet_pton(AF_INET, inet_addr, &st_SockAddr.sin_addr);

   int ip_err = inet_pton(AF_INET, inet_addr, &st_SockAddr.sin_addr);
   cout << "inet_pton: " << ip_err << endl;

   //connect(Socket_D, (const sockaddr *)&st_SockAddr, sizeof(st_SockAddr));

   int c_err = connect(Socket_D, (const sockaddr *)&st_SockAddr, sizeof(st_SockAddr));
   cout << "connect: " << c_err << endl;

   char str_tmp[128];
   while ((count = read(Socket_D, str_tmp, 127)) > 0)
      str_tmp[count] = 0;

   return 0;
}


ps
помотивам первой программы первого издания Unix разработка сетевых приложений.
за мировое господство! банзай, товарищи!
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: просмотр порта\сокета

Сообщение AestheteAnimus »

warp писал(а):
07.09.2008 12:51
почитал Стивенса, вроде дело пишет мужик, но unp.h к пониманияю не приблежает - всё нужно скрыть и как можно скорее вылить материал на читателя... . :]

Быстро ж Вы прочитали Стивенса :wacko: У меня на это ушло около полутора месяцев... Да и напрасно Вы его критикуете, у него все чрезвычайно дотошно описано, с вниманием к мелочям. Да и сам стиль изложения на редкость хороший :)

warp писал(а):
07.09.2008 12:51
а мне разобраться хочеться. так что я тут немного всё перекрутил и получилось вот такое вот вояние. помогите заставит работать

Я, честно говоря, не понял, что именно вы хотите заставить работать... в общемто сам еще изучаю. сей вопрос.. Но допустим все таки простейший эхосервер. Можно например сделать его так (ниакаих проверок здесь я не делал ;) ):

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>

#define SERV_PORT 3000 // Будем слушать по этому порту
#define LISTENQ 10
#define MAXLINE 4096

int main(int argc, char *argv[])
{
    struct sockaddr_in cliaddr, servaddr;
    int clifd, sockfd;
    socklen_t clilen;

    ssize_t n;
    char buf[MAXLINE];

    printf("Simple echo server\n");


    ////////////////////////////////////////////////////////////
    // Создаем соединение с клиентом
    sockfd = socket(AF_INET, SOCK_STREAM, 0); // Получаем дескриптор серверной стороны

        // Заполняем структуру адреса
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htons(INADDR_ANY); // Прослушываемый адрес ("универсальный" адрес - т.е. слушаем все адреса)
    servaddr.sin_port = htons(SERV_PORT); // Просшлушываемый порт

    bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
    listen(sockfd, LISTENQ);

    clilen = sizeof(cliaddr);
    clifd = accept(sockfd, (struct sockaddr*)&cliaddr, &clilen); // Ждем, пока кто-нибудь подцепиться на наш сокет
        // clifd являет собой конечную точку на стороне клиента

    printf("Connected!!!\n");
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    for (;;)
    {
        if ( (n = read(clifd, buf, MAXLINE)) == 0) // Получен сегмент RST от клиента, выходим
            break;
        else
        {
            write(clifd, buf, n); // Шлем эхо
            write(fileno(stdout), buf, n); // Ну заодно и на терминал
        }
    }

    return 0;
}


Запустите сервер и попробуйте постучаться к нему из телнета, например так:

$ telnet localhost 3000
Спасибо сказали:
warp
Сообщения: 135

Re: просмотр порта\сокета

Сообщение warp »

AestheteAnimus > Стивенса в плане того что программа работает после простого копипаста и не содержит гдето то по средине кода лирических отсуплений в страницу размером. ну а на сколько сильно домогаться деталей это уже от меня зависит, главное что бы было поле для эксперемента то биш простая работающая прога. а там я к ней прилажу всё что в ум взбредёт. да, кстати, я и не думал критиковать - просто это не тот автор, который может мне понравиться. впрочем книжку я себе нашёл (linux socket programming by example некого W.W.Gay'я) злюсь что она на англиском и радуюсь что исходники не надо собирать на десяти страницах.
за мировое господство! банзай, товарищи!
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: просмотр порта\сокета

Сообщение AestheteAnimus »

warp писал(а):
08.09.2008 17:30
Стивенса в плане того что программа работает после простого копипаста и не содержит гдето то по средине кода лирических отсуплений в страницу размером.


Пример выше - фактически после копипаста у Стивенса... У Стивенса глубина, обязательно надо читать ;)
Спасибо сказали: