Я пишу программное обеспечение на 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]