Bagaimana saya bisa tahu apakah port TCP terbuka atau tidak? [Tutup]

9

Saya mencoba menerapkan pemrograman socket di C. Ketika saya mencoba untuk terhubung dari klien ke server (Ubuntu), itu menunjukkan kesalahan seperti "koneksi gagal".

Jadi saya pikir masalahnya ada pada port. Saya menggunakan port 5454 / tcp untuk pemrograman socket.

Bagaimana saya bisa tahu jika port 5454 sedang mendengarkan atau tidak? Jika tidak, maka port mana yang dapat saya gunakan untuk pemrograman soket TCP menggunakan C di Ubuntu? Apakah itu masalah dengan port saja atau ada sesuatu yang salah dalam kode saya atau pengaturan apa pun diperlukan di LINUX Ubuntu?

EDIT: Potongan kode:

  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 : Masalahnya ada di port, jadi saya baru saja menginstal ulang Ubuntu, dan itu berfungsi. Terima kasih semuanya.

dxr
sumber
pada awalnya, port 5454 harus mendengarkan keadaan, Kemudian Anda terhubung. periksa firewall Anda.
PersianGulf
Saya selalu mencoba lsof -i:5454(Anda mungkin perlu menjalankannya sebagai pengguna yang sama dengan program yang membuka port, atau sebagai root).
Carlos Campderrós
di mana kode server (atau server adalah program yang ada) Perhatikan bahwa jika Anda ingin menjalankan server dummy, nc (netcat) adalah teman Anda.
Foon

Jawaban:

10

Karena Anda memprogram dalam CI berpikir untuk memposting potongan kecil yang menunjukkan kepada Anda apakah port terbuka atau tidak, saya telah memprogram untuk menampilkan sebuah string. Anda dapat dengan mudah mengubahnya agar sesuai dengan kebutuhan Anda.

Jawab pertanyaan kedua Anda, seperti yang dikatakan semua orang di sini, Anda bisa menggunakan port apa saja jika Anda adalah pengguna super (root) pada sistem jika port tersebut tidak digunakan oleh aplikasi lain. Jika Anda bukan root, maka Anda dapat membuka port apa pun di atas 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;
}
Purinda Gunasekara
sumber
Luar biasa! cara untuk memeriksa status port menggunakan C.
Valentin Bajrami
Saya suka menyebutkan "cuplikan kecil" ^^. Tapi +1 untuk cuplikan yang sangat informatif.
Olivier Dulac
Catatan, dalam kasus kode ini berjalan bersamaan dengan benang lain yang mungkin fork () proses baru, diperlukan untuk memastikan bahwa file descriptor socket ditutup dengan benar dengan menentukan SOCK_CLOEXECuntuk socket()panggilan.
Ton van den Heuvel
5

Ada beberapa cara, yang paling umum mungkin adalah:

# netstat -ltun

Anda dapat, tentu saja, grepuntuk ekspresi (reguler) lainnya.

Jika Anda menggunakan mesin yang berbeda (klien dan server), Anda perlu memeriksa iptablesjuga.

Anda bisa menggunakan port apa saja yang saat ini tidak digunakan untuk program Anda. Namun, periksa /etc/servicesuntuk port yang dikenal dan dicadangkan.

dawud
sumber
Anda dapat langsung mendaftar tcp / udp port dalam keadaan mendengarkan dengan "netstat -ltun"
dsmsk80
ketika saya menggunakan netstat -an | grep DENGARKAN Di sana hanya ada dua tcp prot dan sisanya adalah port UDP. Sekarang jika saya ingin mengaktifkan port 5454 lalu bagaimana cara aktif?
dxr
@ dsmsk80 ah, memang, saya kira kebiasaan buruk sulit mati. Dikoreksi.
dawud
1

Periksa tautan ( http://wi-fizzle.com/article/458 ) apakah port TCP terbuka atau tidak

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
sumber
1

Gunakan perintah:

nmap 192.168.56.101

Ini akan menghasilkan jumlah port terbuka pada mesin itu bersama dengan nama layanan

SHW
sumber
Menggunakan apa pun kecuali nmapuntuk ini berdetak sekitar semak IMHO. Untuk memeriksa satu port yang harus Anda gunakan nmap -p5454 192.168.56.101.
jwg
Ini hanya menjawab judul tetapi tidak menjawab pertanyaan yang sebenarnya.
JZeolla
Iya. Saya hanya menunjukkan arah. Dia harus berjalan untuk mendapatkan jawaban yang diinginkan. :)
SHW
1

Alat terbaik untuk mencoba menentukan apakah suatu proses terikat ke port TCP netstat. Anda dapat menjalankannya seperti itu untuk mendapatkan daftar nama proses yang terikat, jika ada, serta koneksi apa pun ke port, serta statusnya.

Contoh

$ 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         

Di atas menunjukkan port yang dibuka secara lokal di kolom ke-3 dan port jarak jauh yang kami bersedia menerima koneksi, seperti dengan 2 baris ini:

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 baris ini menunjukkan bahwa kita mendengarkan pada port 22, (sshd) dan bersedia menerima koneksi dari antarmuka apa pun yang kita miliki (yaitu kartu jaringan, ethernet, atau nirkabel). Saat ini tidak ada koneksi ke port ini.

Baris ke-2 menunjukkan bahwa kita menjalankan server CUPS (untuk mencetak) pada port 631, dan kita hanya dapat terhubung melalui antarmuka localhost (127.0.0.1).

Lebih jauh ke bawah kita memiliki 2 baris ini:

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 

Yang menunjukkan bahwa kami sedang mengakses situs web di alamat IP 198.252.206.25. Kami tahu ini situs web karena kami mengakses server ini melalui port 80 (HTTP). Juga jika kita mencari alamat IP kita menemukan ini:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
slm
sumber