Bu soru daha önce sorulmuşsa özür dilerim. Seçimi çoğullama kullanarak engelleme olmayan bir yuva istemcisi yazıyorum. Kafamı karıştıran bir şey, engellemesiz bağlantı sunucunun çevrimiçi veya çevrimdışı olmasına bakılmaksızın her zaman başarılı olur. Birçok gönderiyi aradım ve çözümlerini takip ettim, ancak hiçbiri linux ubuntu makinemde çalışmadı. seçme döner ve her zaman başarılı bu geri çağırır, yani gidiş "Hazır/yazma okuma" yerine başarısızlık cerring arasında, blokTıkanmasız Soket bağlantısı her zaman başarılı olur?
static void callback_on_select_write(int connect_fd) {
// Client write event arrived;
int error = -1;
socklen_t len = sizeof(error);
if(getsockopt(connect_fd, SOL_SOCKET, SO_ERROR, &error, &len) == -1) {
return;
}
// getsockopt puts the errno value for connect into erro so 0 means no-error.
if(error == 0) {
// Connection ok.
}
else {
cerr << "Failed to connect\n";
return;
}
// Ready to write/read
}
Her zaman. Bu neden olabilir? Bağlantının gerçekten başarılı olup olmadığını anlamak için taşınabilir bir mekanizmayı nasıl tasarlarım? Aşağıda bağlayıcıyı oluşturmuyorum. seçme döner ve her zaman başarır bu geri çağırır, yani gidiş "Hazır/yazma okuma" bloğu
int make_socket_client(const ::std::string& hostname, const ::std::string& port) {
struct addrinfo hints;
struct addrinfo* res {nullptr};
struct addrinfo* ptr {nullptr};
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
int rv;
int connector;
if((rv = getaddrinfo(hostname.c_str(), port.c_str(), &hints, &res)) != 0) {
return -1;
}
// Try to get the first available client connection.
for(ptr = res; ptr != nullptr; ptr = ptr->ai_next) {
// Ignore undefined ip type.
if(ptr->ai_family != AF_INET && ptr->ai_family != AF_INET6) {
continue;
}
// Create a listener socket and bind it to the localhost as the server.
if((connector = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol)) == -1){
continue;
}
make_fd_nonblocking(connector);
if(connect(connector, (struct sockaddr*)ptr->ai_addr, ptr->ai_addrlen) < 0) {
// This is what we expect.
if(errno == EINPROGRESS) {
break;
}
else {
close(connector);
continue;
}
}
else {
break;
}
}
freeaddrinfo(res);
if(ptr == nullptr) {
return -1;
}
return connector;
}
Şüphesiz 'connect_fd' üzerindeki SO_ERROR'a bakıyor olmalısınız? Ve 'olay' nedir? Bu kod bir soruyu cevaplamak için yeterli değildir. – EJP
Üzgünüm. sadece connect_fd olmalıdır. – Jes
Orijinal 'connect()' sıfırlandı mı? – EJP