मैं कैसे बता सकता हूं कि टीसीपी पोर्ट खुला है या नहीं? [बन्द है]


9

मैं सी में सॉकेट प्रोग्रामिंग को लागू करने की कोशिश कर रहा हूं। जब मैं क्लाइंट से सर्वर (उबंटू) से कनेक्ट करने का प्रयास करता हूं, तो यह "कनेक्शन विफल" जैसी त्रुटि दिखाता है।

इसलिए मुझे लगता है कि समस्या बंदरगाह के साथ है। मैं सॉकेट प्रोग्रामिंग के लिए 5454 / tcp पोर्ट का उपयोग कर रहा हूं।

मैं कैसे जान सकता हूं कि 5454 पोर्ट सुन रहा है या नहीं? यदि यह नहीं है, तो वे कौन से पोर्ट हैं जो मैं Ubuntu में C का उपयोग करते हुए TCP सॉकेट प्रोग्रामिंग के लिए उपयोग कर सकता हूं? क्या केवल पोर्ट के साथ समस्या है या मेरे कोड में कुछ भी गलत है या 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);

संपादित करें : समस्या पोर्ट में है, इसलिए मैंने सिर्फ उबंटू को फिर से स्थापित किया है, और यह काम कर रहा है। आप सभी का धन्यवाद।


पहले, पोर्ट 5454 को राज्य को सुनना चाहिए, फिर आप कनेक्ट करें। इसके अलावा अपने फ़ायरवॉल की जांच करें।
PersianGulf

मैं हमेशा कोशिश करता हूं lsof -i:5454(आपको इसे उसी उपयोगकर्ता के रूप में निष्पादित करने की आवश्यकता हो सकती है जो प्रोग्राम बंदरगाह को खोलने या रूट के रूप में करता है)।
कार्लोस कैंपड्रोस

जहां सर्वर कोड (या सर्वर एक मौजूदा प्रोग्राम है) ध्यान दें कि यदि आप डमी सर्वर चलाना चाहते हैं, तो nc (netcat) आपका मित्र है।
टेलीफोन

जवाबों:


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

अति उत्कृष्ट! सी। का उपयोग करके बंदरगाहों की स्थिति की जांच करने का तरीका
वैलेंटाइन बजरमी

मैं उल्लेख प्यार करता हूँ "थोड़ा स्निपेट" ^ ^। लेकिन बहुत जानकारीपूर्ण स्निपेट के लिए +1।
ओलिवियर दुलक

ध्यान दें, यदि यह कोड अन्य थ्रेड्स के साथ समवर्ती रूप से चलता है जो संभव हो तो कांटा () नई प्रक्रियाओं, यह सुनिश्चित करने के लिए आवश्यक है कि सॉकेट फ़ाइल डिस्क्रिप्टर कॉल के SOCK_CLOEXECलिए निर्दिष्ट करके ठीक से बंद है socket()
टोन वैन डेन हेउवेल

5

कई तरीके हैं, सबसे आम शायद:

# netstat -ltun

आप निश्चित रूप से, grepअन्य (नियमित) अभिव्यक्ति के लिए कर सकते हैं।

यदि आप विभिन्न मशीनों (क्लाइंट और सर्वर) का उपयोग कर रहे हैं, तो आपको भी जांचने की आवश्यकता है iptables

आप अपने कार्यक्रमों के लिए वर्तमान में उपयोग नहीं किए जा रहे किसी भी पोर्ट का बहुत अधिक उपयोग कर सकते हैं। हालांकि, /etc/servicesज्ञात और आरक्षित बंदरगाहों के लिए जाँच करें ।


आप सीधे "netstat -ltun" के साथ सुनने की स्थिति में tcp / udp पोर्ट्स को सूचीबद्ध कर सकते हैं
dsmsk80

जब मैंने netstat -an का उपयोग किया है | grep LISTEN वहाँ केवल दो tcp प्रॉट्स दिखाते हैं और बाकी UDP पोर्ट हैं। अब अगर मुझे 5454 पोर्ट एक्टिव करना है तो एक्टिव कैसे करना है?
dxr

@ dsmsk80 आह, वास्तव में, मुझे लगता है कि बुरी आदतें कठिन मर जाती हैं। सही किया।
दाऊद

1

TCP पोर्ट के लिए लिंक ( http://wi-fizzle.com/article/458 ) खुला है या नहीं

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लिए बुश IMHO के आसपास धड़क रहा है। एकल पोर्ट की जांच करने के लिए आपको उपयोग करना चाहिए nmap -p5454 192.168.56.101
jwg

यह केवल शीर्षक का उत्तर देता है लेकिन वास्तविक प्रश्न का उत्तर नहीं देता है।
जेजोला

हाँ। मैं सिर्फ दिशा दिखा रहा था। उसे वांछित उत्तर पाने के लिए चलना पड़ता है। :)
SHW 30:13

1

यह निर्धारित करने की कोशिश करने के लिए सबसे अच्छा उपकरण है कि क्या कोई प्रक्रिया टीसीपी पोर्ट से जुड़ी है 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      -                   

ये 2 लाइनें दिखाती हैं कि हम पोर्ट 22, (sshd) पर सुन रहे हैं और हमारे पास मौजूद किसी भी इंटरफ़ेस (यानी किसी भी नेटवर्क कार्ड, ईथरनेट या वायरलेस) से कनेक्शन स्वीकार करने के लिए तैयार हैं। वर्तमान में इस पोर्ट का कोई कनेक्शन नहीं है।

दूसरी पंक्ति से पता चलता है कि पोर्ट 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 

जो दिखाते हैं कि हम एक वेबसाइट को आईपी पते 198.252.206.25 पर एक्सेस कर रहे हैं। हम जानते हैं कि यह एक वेबसाइट है क्योंकि हम इस सर्वर को पोर्ट 80 (HTTP) के माध्यम से एक्सेस कर रहे हैं। अगर हम आईपी पते को देखते हैं तो हमें यह पता चलता है:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.