connect возвращает 111 (неверный дескриптор файла) - PullRequest
0 голосов
/ 19 октября 2019

Я пишу программное обеспечение на C ++, которое будет работать как демон и передавать некоторые данные через сокет домена Linux в службу JAVA.

Служба JAVA создаст сокет и вызовет привязку и прослушиваниеэта розетка. Моему сервису нужно будет подключиться к этому порту и передать данные.

Мой сервис проверяет, существует ли сокет, и затем пытается вызвать connect на этом сокете. К сожалению, вызов connect() завершается неудачно с ошибкой 111 (Неверный дескриптор файла).

Чтобы уменьшить его, я, конечно, могу подождать 2 секунды, а затем вызвать соединение, давая серверу время для завершения пары bind()/listen(), но мне интересно, существует ли лучшее решение.

[EDIT]

Вот мой код C ++ для клиента:

    std::unique_lock<std::mutex> lck( mutex, std::defer_lock );
    lck.lock();
    int sock, result = 0;
    struct sockaddr_un serv_addr;
    std::string message;
    if( ( sock = socket( AF_UNIX, SOCK_STREAM, 0 ) ) < 0 )
    {
        syslog( LOG_ERR, "Socket creation failed, error is %d", errno );
        result = 1;
    }
    else
    {
        std::string path = "socket_file.sock";
        serv_addr.sun_family = AF_UNIX;
        strcpy( serv_addr.sun_path, path.c_str() );
        {
            if( connect( sock, (struct sockaddr *) &serv_addr, sizeof( serv_addr ) ) < 0 )
            {
                syslog( LOG_ERR, "Call to connect failed, error is %d", errno );
                result = 1;
            }
            else
            {
                std::ostringstream msg;
                msg << 16 << " " << m_comment;
                if( write( sock, msg.str().c_str(), strlen( msg.str().c_str() ) ) < 0 )
                {
                    syslog( LOG_ERR, "Sending the message failed, error is %d", errno );
                    result = 1;
                }
                else
                {
                    msg.str( std::string() );
                    msg << "\n";
                    if( write( sock, msg.str().c_str(), strlen( msg.str().c_str() ) ) < 0 )
                    {
                        syslog( LOG_ERR, "Sending the message failed, error is %d", errno );
                        result = 1;
                    }
                    else
                    {
                        char *buf = new char[200];
                        if( read( sock, buf, 200 ) < 0 )
                        {
                            syslog( LOG_ERR, "Reading confirmation from the socket failed! Error is %d", errno );
                            result = 1;
                        }
                        else
                        {
                            std::string successMsg = "Message " + msg.str() + " sent successfully!!";
                            syslog( LOG_DEBUG, successMsg.c_str() );
                        }
                    }
                }
                close( sock );
            }
        }
    }
    lck.unlock();
    return result;

[/ EDIT]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...