Как я могу узнать, открыт порт TCP или нет? [закрыто]

9

Я пытаюсь реализовать программирование сокетов на C. Когда я пытаюсь подключиться от клиента к серверу (Ubuntu), появляется сообщение об ошибке типа «ошибка подключения».

Поэтому я думаю, что проблема с портом. Я использую порт 5454 / TCP для программирования сокетов.

Как я могу узнать, прослушивает порт 5454 или нет? Если это не так, то какие порты я могу использовать для программирования сокетов TCP с помощью C в Ubuntu? Это проблема только с портом или в моем коде что-то не так или в LINUX Ubuntu требуются какие-либо настройки?

РЕДАКТИРОВАТЬ: фрагмент кода:

  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);

РЕДАКТИРОВАТЬ : проблема в порту, поэтому я просто переустановил Ubuntu, и он работает. Спасибо вам всем.

дхг
источник
во-первых, порт 5454 должен прослушивать состояние, затем вы подключаетесь. во-вторых, проверьте брандмауэр.
Персидский залив
Я всегда стараюсь 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.
Валентин Байрами
Мне нравится упоминание "маленький фрагмент" ^^. Но +1 за очень информативный фрагмент.
Оливье Дюлак
Обратите внимание, что в случае, если этот код выполняется одновременно с другими потоками, в которых возможны новые процессы fork (), необходимо убедиться, что дескриптор файла сокета правильно закрыт, указав SOCK_CLOEXECэтот socket()вызов.
Тон ван ден
5

Есть несколько способов, наиболее распространенным из которых является:

# netstat -ltun

Можно, конечно, grepдля другого (регулярного) выражения.

Если вы используете разные машины (клиент и сервер), вам также необходимо проверить iptables.

Вы можете в значительной степени использовать любой порт, который в настоящее время не используется для ваших программ. Проверьте, однако, /etc/servicesдля известных и зарезервированных портов.

Дауд
источник
Вы можете напрямую перечислить порты tcp / udp в состоянии прослушивания с помощью "netstat -ltun"
dsmsk80
когда я использовал netstat -an | grep LISTEN Там он показывает только два протокола tcp, а остальные являются портами UDP. Теперь, если я хочу активный порт 5454, то как активен?
2013 г.
@ dsmsk80 ну, действительно, я думаю, вредные привычки умирают тяжело. Исправлено.
Дауд
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
Saravanan
источник
1

Используйте команду:

nmap 192.168.56.101

Это приведет к числу открытых портов на этой машине вместе с названием служб

SHW
источник
Использовать что угодно, кроме как nmapдля этого, бить вокруг куста ИМХО. Чтобы проверить один порт, вы должны использовать nmap -p5454 192.168.56.101.
СРГ
Это только отвечает на заголовок, но не отвечает на фактический вопрос.
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-м столбце и удаленные порты, к которым мы готовы принимать подключения, например, с этими 2 линиями:

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      -                   

Эти две строки показывают, что мы прослушиваем порт 22 (sshd) и готовы принимать подключения с любого имеющегося у нас интерфейса (т. Е. С любой сетевой карты, Ethernet или беспроводной сети). В настоящее время нет подключений к этому порту.

Во второй строке показано, что на сервере 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.
SLM
источник