如何将文件路径转换为套接字结构?

时间:2016-03-10 09:48:44

标签: c multithreading unix

我试图实现一个通过UDS工作的服务器进行任务,我不知道我在做什么。运行main函数的输入参数之一是UDS路径字符串。我们被告知在调用bind之前需要取消链接。

现在我有这个:

int main( int argc, char * argv[] )
{
     if ( argc != 3 )
         return usage( argv[0] );

    log_fd = fopen(argv[1], "a");

    // create a server socket
    // domain (i.e., family) is AF_UNIX
    // type is SOCK_STREAM
    int listenfd = socket(AF_INET, SOCK_STREAM, 0);     

    socklen_t clientLength = sizeof(struct sockaddr);
    struct sockaddr clientAddr;
    clientAddr.sa_family = AF_INET;

    pthread_t tid;

    // unlink the UDS path)
    unlink(argv[2]);

    // bind the server socket
    bind(listenfd, (SA *)&clientAddr, clientLength);    

    // listen
    listen(listenfd, 1024);
    // loop to wait for connections;
    // as each connection is accepted,
    // launch a new thread that calls
    // recv_log_msgs(), which receives
    // messages and writes them to the log file
    while(1){
        printf( "Waiting for a connection on UDS path %s...\n", argv[2] );
        int * clientfdp = malloc(sizeof(int));
        *clientfdp = accept(listenfd, (SA *) &clientAddr, &clientLength);
        pthread_create(&tid, NULL, recv_log_msgs, clientfdp);
    }

    // when the loop ends, close the listening socket
    close(listenfd);        

    // close the log file
    fclose(log_fd);

    return 0;
}

用户输入的UDS路径为argv[2]。正如你所看到的,我从来没有真正使用它,除了取消链接,这没有多大意义。难道UDS路径是以某种方式作为bind参数传递的吗?如果是这样,我如何从路径struct sockaddr获取它?

编辑:

所以我必须将clientAddr的类型更改为strcut sockaddr_un,将家庭更改为AF_UNIX。现在,struct有一个我应该能够设置的路径名值。但现在,当我尝试

clientAddr.sun_path = argv[2];

编译时出错:

`错误:分配给类型' char [108]'时出现不兼容的类型来自' char *'

有人有什么想法吗?

0 个答案:

没有答案