ฉันจะรู้ได้อย่างไรว่าพอร์ต 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 ควรฟังสถานะจากนั้นคุณเชื่อมต่อวินาทีตรวจสอบไฟร์วอลล์ของคุณ
PersianGulf

ฉันพยายามอยู่เสมอlsof -i:5454(คุณอาจต้องเรียกใช้งานด้วยผู้ใช้เดียวกันกับที่โปรแกรมเปิดพอร์ตหรือรูท)
Carlos Campderrós

โดยที่รหัสเซิร์ฟเวอร์ (หรือเป็นเซิร์ฟเวอร์ของโปรแกรมที่มีอยู่) โปรดทราบว่าหากคุณต้องการเรียกใช้เซิร์ฟเวอร์จำลอง nc (netcat) คือเพื่อนของคุณ
Foon

คำตอบ:


10

เนื่องจากคุณกำลังเขียนโปรแกรมใน CI คิดว่าการโพสต์ตัวอย่างเล็ก ๆ น้อย ๆ ซึ่งจะแสดงให้คุณเห็นว่าพอร์ตเปิดอยู่หรือไม่ฉันได้ตั้งโปรแกรมให้เอาท์พุทสตริง คุณสามารถเปลี่ยนได้อย่างง่ายดายเพื่อให้เหมาะกับความต้องการของคุณ

ตอบคำถามที่สองของคุณเหมือนกับทุกคนที่นี่คุณสามารถใช้พอร์ตใดก็ได้ถ้าคุณเป็นผู้ใช้ระดับสูง (รูท) บนระบบหากพอร์ตไม่ได้ใช้โดยแอปพลิเคชันอื่น หากคุณไม่ใช่รูทคุณสามารถเปิดพอร์ตใดก็ได้ที่อยู่เหนือ 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 สำหรับตัวอย่างข้อมูลมาก
Olivier Dulac

หมายเหตุในกรณีที่รหัสนี้ทำงานพร้อมกันกับเธรดอื่น ๆ ที่เป็นไปได้ในกระบวนการ fork () กระบวนการใหม่นั้นจำเป็นต้องมีเพื่อให้แน่ใจว่า descriptor ไฟล์ซ็อกเก็ตถูกปิดอย่างถูกต้องโดยการระบุSOCK_CLOEXECสำหรับการsocket()โทร
Ton van den Heuvel

5

มีหลายวิธีโดยทั่วไปอาจเป็น:

# netstat -ltun

คุณสามารถแน่นอนgrepสำหรับการแสดงออก (ปกติ) อื่น ๆ

หากคุณใช้เครื่องอื่น (ไคลเอนต์และเซิร์ฟเวอร์) คุณต้องตรวจสอบiptablesด้วย

คุณสามารถใช้พอร์ตใดก็ได้ที่ไม่ได้ใช้กับโปรแกรมของคุณ อย่างไรก็ตามตรวจสอบ/etc/servicesพอร์ตที่รู้จักและสำรองไว้


คุณสามารถแสดงรายการพอร์ต tcp / udp โดยตรงในสถานะฟังด้วย "netstat -ltun"
dsmsk80

เมื่อฉันใช้ netstat -an | grep LISTEN ที่นั่นจะแสดงเพียงสองโปรโตคอล tcp และส่วนที่เหลือเป็นพอร์ต UDP ตอนนี้ถ้าฉันต้องการที่จะใช้งานพอร์ต 5454 แล้ววิธีการใช้งาน?
dxr

@ dsmsk80 อาแน่นอนฉันคิดว่านิสัยที่ไม่ดีจะตายยาก การแก้ไข
dawud


1

ใช้คำสั่ง:

nmap 192.168.56.101

มันจะส่งผลให้จำนวนพอร์ตที่เปิดบนเครื่องนั้นพร้อมกับชื่อของบริการ


ใช้อะไรก็ได้ แต่nmapสำหรับสิ่งนี้กำลังเต้นรอบพุ่มไม้ IMHO 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 และพอร์ตระยะไกลที่เรายินดีรับการเชื่อมต่อเช่น 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) และยินดีที่จะยอมรับการเชื่อมต่อจากอินเทอร์เฟซที่เรามี (เช่นการ์ดเครือข่ายอีเธอร์เน็ตหรือไร้สาย) ขณะนี้ไม่มีการเชื่อมต่อกับพอร์ตนี้

บรรทัดที่ 2 แสดงว่ากำลังรันเซิร์ฟเวอร์ CUPS (สำหรับการพิมพ์) บนพอร์ต 631 และเราสามารถเชื่อมต่อผ่านทางโลคัลโฮสต์ (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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.