Создайте сокет из имени хоста и порта, но ::select() указывает на отсутствие данных [закрыто] ⇐ Linux
-
Anonymous
Создайте сокет из имени хоста и порта, но ::select() указывает на отсутствие данных [закрыто]
Я пытаюсь создать сокет, используя имя хоста и порт. Однако ::select() подразумевает, что в сокете нет данных.
Может кто-нибудь помочь?
Отдельный пример ниже (и ссылка на Godbolt).
https://godbolt.org/z/r7G3aczdK
#include #include #include #include #include #include #include #include #include #include #include bool isSocketReady (int sockfd) { fd_set RFDS; структура телевидения timeval; FD_ZERO(&rfds); FD_SET(0, &rfds); тв.тв_сек = 2; tv.tv_usec = 0; const int retval = ::select(sockfd, &rfds, NULL, NULL, &tv); если (ретвал == -1) { printf("Ошибка select()"); вернуть ложь; } иначе, если (ретвал) { printf("Данные теперь доступны.\n"); вернуть истину; } еще { printf("Нет данных в течение таймаута.\n"); вернуть ложь; } } int ConnectByHostName (const std::string& хост, int порт) { интервал Sockfd = -1; подсказки структуры addrinfo; memset(&hints, 0, sizeof(подсказки)); подсказки.ai_flags = AI_ADDRCONFIG | АИ_NUMERICSERV; подсказки.ai_family = AF_UNSPEC; подсказки.ai_socktype = SOCK_STREAM; const std::string port_str = std::to_string(port); структура addrinfo* res{nullptr}; const int r = getaddrinfo(host.c_str(), port_str.c_str(), &hints, &res); если (г ai_next) { sockfd = сокет (адрес->ai_family, адрес->ai_socktype, адрес->ai_protocol); если (sockfd < 0) { продолжать; } int флаг = 1; setockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char*) &flag, sizeof(flag)); if(::connect(sockfd, адрес->ai_addr, адрес->ai_addrlen) < 0) { продолжать; } иначе, если (isSocketReady (sockfd)) { перерыв; } } FreeAddrinfo (рез); вернуть сокфд; } интервал основной() { int sock = ConnectByHostName("example.com", 80); std::cout
Я пытаюсь создать сокет, используя имя хоста и порт. Однако ::select() подразумевает, что в сокете нет данных.
Может кто-нибудь помочь?
Отдельный пример ниже (и ссылка на Godbolt).
https://godbolt.org/z/r7G3aczdK
#include #include #include #include #include #include #include #include #include #include #include bool isSocketReady (int sockfd) { fd_set RFDS; структура телевидения timeval; FD_ZERO(&rfds); FD_SET(0, &rfds); тв.тв_сек = 2; tv.tv_usec = 0; const int retval = ::select(sockfd, &rfds, NULL, NULL, &tv); если (ретвал == -1) { printf("Ошибка select()"); вернуть ложь; } иначе, если (ретвал) { printf("Данные теперь доступны.\n"); вернуть истину; } еще { printf("Нет данных в течение таймаута.\n"); вернуть ложь; } } int ConnectByHostName (const std::string& хост, int порт) { интервал Sockfd = -1; подсказки структуры addrinfo; memset(&hints, 0, sizeof(подсказки)); подсказки.ai_flags = AI_ADDRCONFIG | АИ_NUMERICSERV; подсказки.ai_family = AF_UNSPEC; подсказки.ai_socktype = SOCK_STREAM; const std::string port_str = std::to_string(port); структура addrinfo* res{nullptr}; const int r = getaddrinfo(host.c_str(), port_str.c_str(), &hints, &res); если (г ai_next) { sockfd = сокет (адрес->ai_family, адрес->ai_socktype, адрес->ai_protocol); если (sockfd < 0) { продолжать; } int флаг = 1; setockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char*) &flag, sizeof(flag)); if(::connect(sockfd, адрес->ai_addr, адрес->ai_addrlen) < 0) { продолжать; } иначе, если (isSocketReady (sockfd)) { перерыв; } } FreeAddrinfo (рез); вернуть сокфд; } интервал основной() { int sock = ConnectByHostName("example.com", 80); std::cout
Мобильная версия