请首先我要说明,我不知道如何在C中编程。这是一个我试图运行的软件,它给了我这个错误。因此,可执行文件的名称称为BGPdb_ctl2,它是大型程序的一部分。该程序大约9年前编写。当主程序运行BGPdb_ctl2时,我有一个错误,该错误位于“创建unix socket失败”的域下,所以我去了程序的src来查看BGPdb_ctl2的源代码并找到“失败的地方”在连接“是。在这里:
ret = connect(sock, (struct sockaddr *) &addr, addr_len);
if ( ret == -1 ) {
err( EXIT_FAILURE, "failed in connect" );
}
所以我真的不知道为什么返回-1。也许这是一个旧的弃用方法等?不知道,但它似乎在8年前从开发人员工作。我使用的是Ubuntu 13.04。
这是完整的代码:
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <err.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern int errno;
int main( int argc, char **argv ) {
int ret;
int sock;
struct sockaddr_un addr;
socklen_t addr_len;
char command[64];
int length;
char buff[128];
/* CHECK: Add a getopts thing here... right now, I'm lazy... */
sock = socket( AF_UNIX, SOCK_STREAM, 0 );
if ( sock == -1 ) {
err( EXIT_FAILURE, "failed creating unix_socket" );
}
memset( &addr, 0, sizeof(struct sockaddr_un) );
addr.sun_family = AF_UNIX;
strcpy( addr.sun_path, DBDIR );
strcat( addr.sun_path, "loader.socket" );
addr_len = sizeof(addr.sun_family) +
strlen(addr.sun_path);
ret = connect(sock, (struct sockaddr *) &addr, addr_len);
if ( ret == -1 ) {
err( EXIT_FAILURE, "failed in connect" );
}
if ( argc != 2 ) {
errx( EXIT_FAILURE, "usage: prefserv-ctl command\n\tcommand\t"
"load - load update files\n\n" );
}
snprintf( command, 64, "%s\n", argv[1] );
ret = send( sock, command, strlen(command), 0 );
memset ( &command, 0,sizeof(command));
memset ( &buff, 0,sizeof(command));
while( (length = recv(sock, buff, 128, 0)) > 0 ) {
sscanf( buff, "%63s", command );
if ( strcmp( command, "done" ) == 0 ) {
break;
}
}
return 0;
}
更新
这是一个与 loader.socket 有关的文件。该文件被调用 的 loader.server
ret = bind(unix_sock, (struct sockaddr *) &unix_addr, unix_addr_len);
if ( ret == -1 ) {
warn( "failed in bind" );
return ((void *) NULL);
}
ret = listen( unix_sock, 1 /* Number to log */ );
if ( ret == -1 ) {
warn( "failed in bind" );
return ((void *) NULL);
如果您需要更多代码,请不要犹豫。任何繁琐的调试技巧都非常受欢迎。