Як я можу дізнатись, чи відкритий порт 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.