Hệ điều hành là Linux. Tôi có một quy trình máy chủ có thể thay đổi thời gian thực của cổng. Tuy nhiên tôi muốn biết trước nếu một cổng là miễn phí trước khi ràng buộc.làm thế nào để tìm thấy trong C mà một cổng là miễn phí để sử dụng?
Tình huống: Máy chủ liên kết localhost: 5000 và nhận yêu cầu liên kết tại localhost: 6000. Máy chủ phải kiểm tra xem cổng có miễn phí hay không. Câu hỏi này tìm kiếm câu trả lời cung cấp một thói quen kiểm tra xem một cổng là miễn phí hay không.
Để lưu nội dung, tôi đang chỉnh sửa câu hỏi của mình bằng đoạn mã để kiểm tra xem có sử dụng cổng hay không. Điều này không có nghĩa là nó sẽ được sử dụng. Mã bên dưới trả lời cho câu hỏi "nếu cổng hiện khả dụng", nó không sử dụng nó. Mở một socket, kiểm tra xem bind có trả về EADDRINUSE và đóng socket không.
#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;
}
Dưới đây là một số chạy mẫu (kết quả đầu ra từng phần)
[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
Hãy thử gắn vào nó, nếu nó không thành công, nó không miễn phí ... – Nick
Nicks gợi ý có lẽ là giải pháp di động nhất, nhưng có thể có cách OS cụ thể để làm nó là tốt. Bạn sẽ sử dụng hệ điều hành nào? –
@Nick trông rằng ràng buộc trả về EADDRINUSE (errno) nếu cổng là nó không miễn phí. – cateof