Làm cách nào để biết cổng TCP có mở hay không? [đóng cửa]


9

Tôi đang cố gắng thực hiện lập trình socket trong C. Khi tôi cố gắng kết nối từ máy khách đến máy chủ (Ubuntu), nó sẽ hiển thị một lỗi như "kết nối thất bại".

Vì vậy, tôi nghĩ rằng vấn đề là với cổng. Tôi đang sử dụng cổng 5454 / tcp để lập trình socket.

Làm sao để biết cổng 5454 có nghe hay không? Nếu không, thì đó là cổng nào tôi có thể sử dụng để lập trình socket TCP bằng C trong Ubuntu? Có phải đó chỉ là vấn đề với cổng hoặc có gì sai trong mã của tôi hoặc có bất kỳ cài đặt nào được yêu cầu trong LINUX Ubuntu không?

EDIT: Đoạn mã:

  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 : Vấn đề nằm ở cổng, vì vậy tôi mới cài đặt lại Ubuntu và nó hoạt động. Cảm ơn tất cả các bạn.


Đầu tiên, cổng 5454 sẽ lắng nghe trạng thái, Sau đó, bạn kết nối. Thứ hai kiểm tra tường lửa của bạn.
Tiếng Ba Tư

Tôi luôn cố gắng lsof -i:5454(bạn có thể cần phải thực thi nó với cùng một người dùng mà chương trình mở cổng thực hiện hoặc với quyền root).
Carlos Campderrós

mã máy chủ (hoặc là máy chủ là chương trình hiện có) Lưu ý rằng nếu bạn muốn chạy một máy chủ giả, nc (netcat) là bạn của bạn.
Foon

Câu trả lời:


10

Vì bạn đang lập trình trong CI nghĩ đến việc đăng một đoạn nhỏ cho bạn biết cổng có mở hay không, tôi đã lập trình để xuất ra một chuỗi. Bạn có thể dễ dàng thay đổi nó để phù hợp với nhu cầu của bạn.

Trả lời câu hỏi thứ hai của bạn, như mọi người ở đây đã nói, bạn có thể sử dụng bất kỳ cổng nào nếu bạn là siêu người dùng (root) trên hệ thống nếu cổng đó không được sử dụng bởi bất kỳ ứng dụng nào khác. Nếu bạn không phải là root thì bạn có thể mở bất kỳ cổng nào trên 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;
}

Thông minh! cách kiểm tra trạng thái của một cổng bằng C.
Valentin Bajrami

Tôi thích đề cập đến "một đoạn nhỏ" ^^. Nhưng +1 cho một đoạn rất nhiều thông tin.
Olivier Dulac

Lưu ý, trong trường hợp mã này chạy đồng thời với các luồng khác có thể xử lý fork () mới, thì cần phải đảm bảo rằng bộ mô tả tệp ổ cắm được đóng đúng bằng cách chỉ định SOCK_CLOEXECcho socket()cuộc gọi.
Ton van den Heuvel

5

Có một số cách, phổ biến nhất có lẽ là:

# netstat -ltun

Tất nhiên, bạn có thể grepcho biểu thức (thông thường) khác.

Nếu bạn đang sử dụng các máy khác nhau (máy khách và máy chủ), bạn cũng cần kiểm tra iptables.

Bạn có thể sử dụng khá nhiều bất kỳ cổng nào hiện không được sử dụng cho các chương trình của bạn. Kiểm tra, tuy nhiên, /etc/servicescho các cổng được biết và dành riêng.


Bạn có thể liệt kê trực tiếp các cổng tcp / udp ở trạng thái nghe bằng "netstat -ltun"
dsmsk80

khi tôi sử dụng netstat -an | grep LISTEN Ở đó, nó chỉ hiển thị hai tcp prots và phần còn lại là các cổng UDP. Bây giờ nếu tôi muốn kích hoạt cổng 5454 thì phải kích hoạt như thế nào?
dxr

@ dsmsk80 ah, quả thực, tôi đoán thói quen xấu chết cứng. Đã sửa.
dawud

1

Kiểm tra liên kết ( http://wi-fizzle.com/article/458 ) xem cổng TCP có mở hay không

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

Sử dụng lệnh:

nmap 192.168.56.101

Nó sẽ dẫn đến số lượng cổng được mở trên máy đó cùng với tên của dịch vụ


Sử dụng bất cứ thứ gì nhưng nmapcho việc này là đập xung quanh bụi cây IMHO. Để kiểm tra một cổng duy nhất bạn nên sử dụng nmap -p5454 192.168.56.101.
jwg

Điều này chỉ trả lời tiêu đề nhưng không trả lời câu hỏi thực tế.
JZeolla

Đúng. Tôi chỉ cho thấy hướng đi. Anh phải đi bộ để có câu trả lời mong muốn. :)
SHW

1

Công cụ tốt nhất để cố gắng xác định xem một quy trình có bị ràng buộc với cổng TCP không netstat. Bạn có thể chạy nó như vậy để có được danh sách tên của quy trình bị ràng buộc, nếu có, cũng như bất kỳ kết nối nào với cổng, cũng như trạng thái của chúng.

Thí dụ

$ 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         

Ở trên hiển thị các cổng được mở cục bộ trong cột thứ 3 và các cổng từ xa, chúng tôi sẵn sàng chấp nhận các kết nối, như với 2 dòng này:

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      -                   

Hai dòng này cho thấy chúng tôi đang nghe trên cổng 22, (sshd) và sẵn sàng chấp nhận các kết nối từ bất kỳ giao diện nào chúng tôi có (tức là bất kỳ card mạng, ethernet hoặc không dây). Hiện tại không có kết nối đến cổng này.

Dòng thứ 2 cho thấy rằng họ đang chạy máy chủ CUPS (để in) trên cổng 631 và chúng tôi chỉ có thể kết nối với nó thông qua giao diện localhost (127.0.0.1).

Xa hơn nữa chúng ta có 2 dòng này:

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 

Điều đó cho thấy rằng chúng tôi đang truy cập một trang web tại địa chỉ IP 198.252.206.25. Chúng tôi biết đó là một trang web vì chúng tôi đang truy cập máy chủ này thông qua cổng 80 (HTTP). Ngoài ra nếu chúng tôi tìm địa chỉ IP, chúng tôi tìm thấy điều này:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.