ओएस लिनक्स है। मेरे पास एक सर्वर प्रक्रिया है जो इसके पोर्ट रीयलटाइम को बदल सकती है। हालांकि अगर मैं बाध्यकारी से पहले एक बंदरगाह मुक्त हूं तो मैं पहले से जानना चाहता हूं।सी में मुझे कैसे मिल सकता है कि एक बंदरगाह उपयोग करने के लिए स्वतंत्र है?
परिदृश्य: सर्वर स्थानीयहोस्ट को बांधता है: 5000 और स्थानीयहोस्ट पर बांधने का अनुरोध प्राप्त करता है: 6000। सर्वर को यह जांचना है कि बंदरगाह मुक्त है या नहीं। यह प्रश्न उन उत्तरों की तलाश करता है जो नियमित रूप से प्रदान करते हैं जो जांचता है कि कोई बंदरगाह मुक्त है या नहीं।
रिकॉर्ड के लिए, मैं एक कोड स्निपेट के साथ अपना प्रश्न संपादित कर रहा हूं जो जांचता है कि कोई पोर्ट उपयोग करने के लिए स्वतंत्र है या नहीं। इसका मतलब यह नहीं है कि इसका इस्तेमाल किया जाएगा। नीचे दिए गए कोड "अगर बंदरगाह अभी उपलब्ध है" प्रश्न का उत्तर देते हैं, तो इसका उपयोग नहीं होता है। एक सॉकेट खोलता है, जांचें कि बाइंड EADDRINUSE लौटाता है और सॉकेट बंद करता है।
#include <iostream>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
int main(int argc, char **argv) {
struct sockaddr_in serv_addr;
if(argc < 2)
return 0;
int port = atoi(argv[1]);
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0) {
printf("socket error\n");
return 0;
} else {
printf("Opened fd %d\n", sockfd);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
if(errno == EADDRINUSE)
{
printf("the port is not available. already to other process\n");
} else {
printf("could not bind to process (%d) %s\n", errno, strerror(errno));
}
}
if (close (sockfd) < 0) {
printf("did not close fd: %s\n", strerror(errno));
return errno;
}
return 0;
}
यहाँ कुछ नमूना रन (आंशिक आउटपुट)
[bash{1051}{51}]:[~/some_sources/checkbind]::./a.out 41067
the port is not available. already to other process
[bash{1052}{52}]:[~/some_sources/checkbind]::./a.out 22
could not bind to process (13) Permission denied
[bash{1053}{53}]:[~/some_sources/checkbind]::./a.out 22000
Opened fd 3
यह के लिए बाध्य की कोशिश करें, अगर यह विफल, यह मुफ़्त नहीं है ... – Nick
Nicks सुझाव शायद सबसे पोर्टेबल समाधान है, लेकिन वहाँ ओएस-विशिष्ट तरीके करने के लिए हो सकता है यह भी। आप किस ऑपरेटिंग सिस्टम का उपयोग करेंगे? –
@ निक लगता है कि बंदरगाह EADDRINUSE (errno) देता है अगर पोर्ट यह मुफ़्त नहीं है। – cateof