Всякий раз, когда я пытаюсь запустить свое приложение на macOS Catalina 10.15.2 (19C57) или Linux 5.4.3-arch1-1 x86_64 GNU / Linux, я получаю:
_rSockd: bind: Address already in use
libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: failed to bind to socket
[1] 31181 abort Saol/saol
сейчас Я проверил открытые порты с sudo netstat -tulp udp
и sudo lsof -i udp
, но ни один из них не сообщает ни о каких моих приложениях, использующих эти порты. В данный момент ничего не прослушивает порт (45100).
Я просмотрел несколько похожих постов, в которых упоминалось добавление SO_REUSEADDR
, но это ничего не изменило, когда он у меня есть или когда у меня его нет. В сообщениях также упоминалось о проверке чего-либо с использованием порта, но я не смог (я полагаю, если только вышеприведенные команды не были использованы неправильно), чтобы найти мои порты заблокированными. Я пробовал несколько разных портов (в настоящее время используется 45100); _port
var устанавливается на int
до вызова функции _Init
. Второй аргумент getaddrinfo
- это const char *service
, и он указан на страницах руководства:
служба устанавливает порт в каждой возвращаемой структуре адресов. Если этот аргумент является именем службы (см. Services (5)), он преобразуется в соответствующий номер порта. Этот аргумент также может быть указан как десятичное число, которое просто преобразуется в двоичный. Если служба NULL, то номер порта возвращенных адресов сокетов останется неинициализированным. Если AI_NUMERICSERV указан в hints.ai_flags и служба не равна NULL, тогда служба должна указывать на строку, содержащую цифру c номер порта. Этот флаг используется для запрета вызова службы разрешения имен в тех случаях, когда известно, что она не требуется.
Все, что я делаю с _port, это: int
-> string
-> char *
Ниже приведен соответствующий раздел моего кода:
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#define PORT "45100"
auto main(void) -> int {
int rv;
int _rSockd;
const char * port = std::to_string(8080).c_str();
struct addrinfo hints;
struct addrinfo *servinfo;
struct addrinfo *p;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_PASSIVE;
if((rv = getaddrinfo(NULL, port, &hints, &servinfo)) != 0) {
std::cerr << "getaddrinfo: " << std::endl << gai_strerror(rv) << std::endl;
throw std::runtime_error("failed to getaddrinfo");
}
for(p = servinfo; p != NULL; p = p->ai_next) {
if((_rSockd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
std::perror("_rSockd: socket");
close(_rSockd);
continue;
}
if(bind(_rSockd, p->ai_addr, p->ai_addrlen) == -1) {
close(_rSockd);
std::perror("_rSockd: bind");
continue;
}
break;
}
if(p == NULL) {
throw std::runtime_error("failed to bind to socket");
}
freeaddrinfo(servinfo);
return 0;
}
Буду признателен за любую помощь; Я чувствую, что смотрю на него слишком долго и что-то упускаю из виду c.
ПРИМЕЧАНИЕ: Когда я добавил MCVE (приведенный выше обновленный код), у меня больше нет моего проблема при работе с портами 8080 и 45100. Поэтому я сейчас объясню Теперь проверьте, не вызывает ли это проблему.
ОБНОВЛЕНИЕ
Когда я сделал MCVE, все заработало. У него никогда не было проблем с моей базой проекта. Мой проект - это библиотека, вызываемая из другого исполняемого проекта. libSaol имеет сетевой код, saol - исполняемый файл, который связывает libSaol.
Если честно, меня это смущает больше ...