Das Betriebssystem ist Linux. Ich habe einen Server-Prozess, der seine Port-Echtzeit ändern kann. Ich würde jedoch gerne im Voraus wissen, ob ein Hafen frei ist, bevor er verbindlich ist.Wie finde ich in C, dass ein Port frei ist?
Szenario: Server bindet localhost: 5000 und erhält eine Anforderung zum Binden an localhost: 6000. Der Server muss prüfen, ob der Port frei ist. Diese Frage sucht nach Antworten, die eine Routine bereitstellen, die überprüft, ob ein Port frei ist oder nicht.
Zum Bearbeiten meiner Frage mit einem Code-Snippet, das überprüft, ob ein Port frei ist zu verwenden. Dies bedeutet nicht, dass es verwendet wird. Der folgende Code beantwortet die Frage "Wenn der Port gerade verfügbar ist", er verwendet ihn nicht. Öffnet einen Socket, überprüft, ob die Bindung EADDRINUSE zurückgibt und schließt den Socket.
#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;
}
Hier sind einige Beispiele für Läufe (Teil Ausgänge)
[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
Versuchen Sie es verbindlich, wenn es scheitert, es ist nicht kostenlos ... – Nick
Nicks Vorschlag wohl die tragbare Lösung ist, aber es könnte OS-spezifische Weise zu tun, es auch. Welches Betriebssystem werden Sie verwenden? –
@Nick sieht aus, dass die Bindung EADDRINUSE (errno) zurückgibt, wenn der Port nicht frei ist. – cateof