Як я можу дізнатись, чи відкритий порт TCP чи ні? [зачинено]


9

Я намагаюся реалізувати програмування сокетів у C. Коли я намагаюся підключитися від клієнта до сервера (Ubuntu), він показує помилку типу "з'єднання не вдалося".

Тому я думаю, що проблема в порту. Я використовую порт 5454 / tcp для програмування сокет.

Як я можу дізнатися, слухає чи 5454 порт? Якщо ні, то які саме порти я можу використовувати для програмування сокетів TCP, використовуючи C в Ubuntu? Це проблема лише з портом або в моєму коді щось не так, або в LINUX Ubuntu потрібні якісь налаштування?

EDIT: Фрагмент коду:

  int socket_send;
   struct sockaddr_in address;
printf("\n Initialization Socket....");

socket_send = socket(AF_INET,SOCK_STREAM,0);
if(socket_send == -1)
{
    perror("\n Socket not created.Error:");
    return 1;
}
printf("\n Socket created");

address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(ip);
address.sin_port=htons(5454);

if(connect(socket_send,(struct sockaddr*)&address,sizeof(struct sockaddr))<0)
{
    perror("\nConnetion failed.Error:");
    return 1;
}
printf("\n Connected");

if(send(socket_send,(char*)buffer,size,flag)<0)
{
    perror("\nSending failed.Error:");
    return 1;
}
printf("\n Data successfully sent");
 close(socket_send);

EDIT : Проблема в порту, тому я щойно встановив Ubuntu, і він працює. Дякую всім вам


спочатку порт 5454 повинен прослуховувати стан, потім ви підключаєте.друге перевіряєте свій брандмауер.
— PersianGulf

Я завжди намагаюся lsof -i:5454(можливо, вам потрібно буде виконати його як той самий користувач, який робить програма, що відкриває порт, або як root).
— Карлос Кампдеррос

де серверний код (або це сервер існуючої програми) Зауважте, що якщо ви хочете запустити фіктивний сервер, nc (netcat) - ваш друг.
— Foon

Відповіді:


10

Оскільки ви програмуєте в CI, думали надрукувати невеликий фрагмент, який показує вам, чи відкритий порт чи ні, я запрограмував виводити рядок. Ви можете легко змінити його відповідно до ваших потреб.

Відповідаючи на ваше друге запитання, як і всі, хто тут сказав, ви можете в значній мірі використовувати будь-який порт, якщо ви супер користувач (root) у системі, якщо порт не використовується жодною іншою програмою. Якщо ви не root, тоді ви можете відкрити будь-який порт вище 1024.

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


int main(int argc, char *argv[])
{
    int portno     = 5454;
    char *hostname = "192.168.56.101";

    int sockfd;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        error("ERROR opening socket");
    }

    server = gethostbyname(hostname);

    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);

    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
        printf("Port is closed");
    } else {
        printf("Port is active");
    }

    close(sockfd);
    return 0;
}

Відмінно! спосіб перевірити стан портів за допомогою C.
— Valentin Bajrami

Я люблю згадку "маленький фрагмент" ^^. Але +1 за дуже інформативний фрагмент.
— Олів'є Дулак

Зауважте, якщо цей код працює одночасно з іншими потоками, які можливі нові процеси fork (), потрібно переконатися, що дескриптор файлу сокета закритий належним чином, вказавши SOCK_CLOEXECдля socket()виклику.
— Тон ван ден Хевель

5

Існує кілька способів, мабуть, найпоширеніший:

# netstat -ltun

Можна, звичайно, grepдля іншого (регулярного) вираження.

Якщо ви використовуєте різні машини (клієнт та сервер), вам також потрібно перевірити iptables.

Ви можете майже використовувати будь-який порт, який наразі не використовується для ваших програм. Однак перевірте /etc/servicesнаявність відомих та зарезервованих портів.


Ви можете безпосередньо перелічити порти tcp / udp у стані прослуховування за допомогою "netstat -ltun"
— dsmsk80

коли я використовував netstat -an | grep LISTEN Там показано лише два протоколи tcp, а решта - порти UDP. Тепер, якщо я хочу активувати порт 5454, то як активувати?
— dxr

@ dsmsk80 ах, справді, я думаю, шкідливі звички важко помирають. Виправлено.
— dawud

1

Перевірте посилання ( http://wi-fizzle.com/article/458 ) на те, чи відкритий порт TCP чи ні

nc -z <host_or_ip> <port> 1>/dev/null 2>&1; result=$?;

if [ $result -eq 0 ]; then
    echo 'the port is open for tcp connections'
else
    echo 'the port was closed'
fi

1

Використовуйте команду:

nmap 192.168.56.101

Це призведе до кількості відкритих портів на цій машині, а також назви служб


Використовуючи що завгодно, але nmapдля цього є побиття навколо куща ІМХО. Для перевірки одного порту, який ви повинні використовувати nmap -p5454 192.168.56.101.
— jwg

Це відповідає лише на назву, але не відповідає на власне питання.
— JZeolla

Так. Я тільки показував напрямок. Йому доводиться ходити, щоб отримати бажану відповідь. :)
— SHW

1

Кращий інструмент для спроби визначити, чи пов'язаний процес до порту TCP netstat. Ви можете запустити його так, щоб отримати список імен пов'язаного процесу, якщо такий є, а також будь-які з'єднання з портом, а також їх стан.

Приклад

$ netstat -tapn | head -15
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:49006               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:17500               0.0.0.0:*                   LISTEN      3516/dropbox        
tcp        0      0 0.0.0.0:17501               0.0.0.0:*                   LISTEN      3517/dropbox        
tcp        0      0 0.0.0.0:2143                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 127.0.0.1:1986              0.0.0.0:*                   LISTEN      2757/mono           
tcp        0      0 0.0.0.0:2025                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 
tcp        0      0 192.168.1.20:58286          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:54000          174.37.23.130:6667          ESTABLISHED 2696/pidgin         

Наведене вище показує локально відкриті порти у 3-му стовпці та віддалені порти, до яких ми готові прийняти з'єднання, наприклад з цими двома рядками:

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   

Ці 2 рядки показують, що ми слухаємо на порту 22 (sshd) і готові приймати з'єднання з будь-якого інтерфейсу, який ми маємо (тобто будь-якої мережевої карти, ethernet або бездротового зв'язку). На даний момент до цього порту немає з'єднань.

2-й рядок показує, що на портах 631 працює сервер CUPS (для друку), і ми можемо підключитися до нього лише через інтерфейс localhost (127.0.0.1).

Далі ми маємо ці 2 рядки:

tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 

Які показують, що ми отримуємо доступ до веб-сайту за IP-адресою 198.252.206.25. Ми знаємо, що це веб-сайт, оскільки ми отримуємо доступ до цього сервера через порт 80 (HTTP). Також якщо ми подивимось на IP-адресу, ми виявимо це:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.