From de754c5f27751e42ad4c456291cf7041e1ac1139 Mon Sep 17 00:00:00 2001 From: Horst Schirmeier Date: Tue, 21 May 2013 16:52:42 +0200 Subject: [PATCH] comm: handle connect() failures properly Quoting connect(3posix): "If connect() fails, the state of the socket is unspecified. Conforming applications should close the file descriptor and create a new socket before attempting to reconnect." Change-Id: Ibcdcc0f546560a41009832894659a37947243f2f --- src/core/efw/JobClient.cc | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/core/efw/JobClient.cc b/src/core/efw/JobClient.cc index 3d36accb..2df2171b 100644 --- a/src/core/efw/JobClient.cc +++ b/src/core/efw/JobClient.cc @@ -30,28 +30,29 @@ JobClient::~JobClient() bool JobClient::connectToServer() { - // Connect to server - struct sockaddr_in serv_addr; - m_sockfd = socket(AF_INET, SOCK_STREAM, 0); - if(m_sockfd < 0) { - perror("[Client@socket()]"); - // TODO: Log-level? - exit(0); - } - - /* Enable address reuse */ - int on = 1; - setsockopt( m_sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ); - - memset(&serv_addr, 0, sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - memcpy(&serv_addr.sin_addr.s_addr, m_server_ent->h_addr, m_server_ent->h_length); - serv_addr.sin_port = htons(m_server_port); - int retries = CLIENT_RETRY_COUNT; while (true) { + // Connect to server + struct sockaddr_in serv_addr; + m_sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (m_sockfd < 0) { + perror("[Client@socket()]"); + // TODO: Log-level? + exit(0); + } + + /* Enable address reuse */ + int on = 1; + setsockopt( m_sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ); + + memset(&serv_addr, 0, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + memcpy(&serv_addr.sin_addr.s_addr, m_server_ent->h_addr, m_server_ent->h_length); + serv_addr.sin_port = htons(m_server_port); + if (connect(m_sockfd, (sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("[Client@connect()]"); + close(m_sockfd); // TODO: Log-level? if (retries > 0) { // Wait CLIENT_RAND_BACKOFF_TSTART to RAND_BACKOFF_TEND seconds: