вот начал баловаться с сетевыми програмками и тут стал вопрос - как их проконтролировать?
то есть можно ли просмотреть открытые порты или этот подход не верен? как ещё можно посмотреть чем занимаеться прога в сети?
просмотр порта\сокета
Модератор: Модераторы разделов
-
warp
- Сообщения: 135
просмотр порта\сокета
за мировое господство! банзай, товарищи!
-
Voice
- Сообщения: 1073
- Статус: столлманист
- ОС: Debian GNU/Linux
Re: просмотр порта\сокета
netstat, tcpdump, telnet (для "общения" с программой).
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов
-
warp
- Сообщения: 135
Re: просмотр порта\сокета
ах да! я забыл самое главное - я пытаюсь их писать. )) оно мне просто казалось на столько само собой разумеющиеся что я даже не подумал об этом написать.
я сделал нечто работой чего хочу полюбоваться.
естественно sin >> xxx нужно для того чтобы успеть посмотреть что там у меня программа делает. но тут небольшая загводка как это сделать?
посмотрел в ps нашёл вот это
warp 10492 0.0 0.0 2524 580 pts/1 S+ 19:32 0:00 ./a.out
затем сделал вот такое тело движение
netstat -p 10492
но у меня вывались ну очень неприличное колличество строк, тогда как мне надо что бы было только по 10492. ну собственно и сам вопрос - можно ли это сделать и если да то как?
я сделал нечто работой чего хочу полюбоваться.
Код: Выделить всё
#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: просмотр порта\сокета
что то я совсем с опциями netstat'a замудрил. будем считать что последнии два предложения написали иноплонетяни.
за мировое господство! банзай, товарищи!
-
AestheteAnimus
- Сообщения: 135
- ОС: FreeBSD 8.0-RELEASE amd64
Re: просмотр порта\сокета
Читать Стивенса
И это описано у стивенса
А вообще, можно сделать так:
netstat -na | grep tcp
-
warp
- Сообщения: 135
Re: просмотр порта\сокета
thx, AestheteAnimus!
почитал Стивенса, вроде дело пишет мужик, но unp.h к пониманияю не приблежает - всё нужно скрыть и как можно скорее вылить материал на читателя... а мне разобраться хочеться. так что я тут немного всё перекрутил и получилось вот такое вот вояние. помогите заставит работать. :]
в коментах оригинал программы без контроля ошибок и прочего - просто чтоб работала. все что идёт через пустую строку после закоменченных строк для удобства отладки. в моём случае программа останавливается на
ps
помотивам первой программы первого издания Unix разработка сетевых приложений.
почитал Стивенса, вроде дело пишет мужик, но 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: просмотр порта\сокета
Быстро ж Вы прочитали Стивенса
Я, честно говоря, не понял, что именно вы хотите заставить работать... в общемто сам еще изучаю. сей вопрос.. Но допустим все таки простейший эхосервер. Можно например сделать его так (ниакаих проверок здесь я не делал
Код: Выделить всё
#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: просмотр порта\сокета
AestheteAnimus > Стивенса в плане того что программа работает после простого копипаста и не содержит гдето то по средине кода лирических отсуплений в страницу размером. ну а на сколько сильно домогаться деталей это уже от меня зависит, главное что бы было поле для эксперемента то биш простая работающая прога. а там я к ней прилажу всё что в ум взбредёт. да, кстати, я и не думал критиковать - просто это не тот автор, который может мне понравиться. впрочем книжку я себе нашёл (linux socket programming by example некого W.W.Gay'я) злюсь что она на англиском и радуюсь что исходники не надо собирать на десяти страницах.
за мировое господство! банзай, товарищи!
-
AestheteAnimus
- Сообщения: 135
- ОС: FreeBSD 8.0-RELEASE amd64