创建Unix套接字失败

时间:2013-12-02 12:47:59

标签: c sockets unix unix-socket

请首先我要说明,我不知道如何在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);

如果您需要更多代码,请不要犹豫。任何繁琐的调试技巧都非常受欢迎。

0 个答案:

没有答案