9

Unix ローカル ソケットを使用して以下の C ソースを作成すると、アドレスが既に使用されているというエラーが表示されました。詳細情報を確認man 7 Unixした後、プログラムを実行するサブフォルダーを作成しようとしました (明らかにsun_path現在のフォルダーのフィールドを変更します) が、エラーは同じでした。

私を助けることができる人はいますか?

ソースコード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <unistd.h>
#include <errno.h>

#define MAXLEN  128

int main (int argc, char *argv[]){

        struct sockaddr_un      server;
        int                                     serverfd, clientfd;
        socklen_t                       addrsize = sizeof(struct sockaddr_un);
        char                            buff[MAXLEN], *path;

        if (argc < 2){
                printf("Error: %s [MESSAGE]\n", argv[0]);
                return 1;
        }

        if ((serverfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
                printf("Error \"%s\" in socket()\n", strerror(errno));
                exit(1);
        }
        puts("socket()");

        server.sun_family = AF_UNIX;
        path = strcpy(server.sun_path, "/home/myhome/Dropbox/Sources/C/sub");

        printf("[DEBUG]Address bound at %s\n", path);

        if ((bind(serverfd, (struct sockaddr*)&server, addrsize)) < 0){
                printf("Error \"%s\" in bind()\n", strerror(errno));
                exit(1);
        }
        puts("bind()");


        if ((listen(serverfd, 1)) < 0){
                printf("Error \"%s\" in listen()\n", strerror(errno));
                exit(1);
        }

        if ((clientfd = accept(serverfd, NULL, &addrsize)) < 0){
                printf("Error \"%s\" in accept()\n", strerror(errno));
                exit(1);
        }

        write(clientfd, argv[1], strlen(argv[1]));
        read(clientfd, buff, sizeof(buff));

        puts(buff);

        close(clientfd);
        close(serverfd);
        return 0;
}
4

2 に答える 2

18

呼び出す前にファイルを取得する必要unlink()があります。実行中にファイルが存在すると、このエラーが発生します。アプリケーションを終了する前にファイルのリンクを解除/削除するか、バインドする前に常にリンクを解除する必要があります。pathbindbind

bindの man ページを確認してください。また、最後の man ページに示されている例にも注意してください。

于 2013-07-03T15:39:37.730 に答える
-4

次のように SO_REUSEADDR フラグを使用してみることができます。

int yes = 1;
if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
    // error handling
    exit(1);
}
于 2013-07-03T15:43:11.160 に答える