- ベストアンサー
bindとmkstempの使い方に問題が生じる原因とは?
- ソケットプログラミングにおいて、bindとmkstempを使用してユニークなアドレスを作成する際に問題が生じています。
- mkstempを使用しない場合は正しくソケットファイルが生成されますが、mkstempを使用するとbindに失敗し、Address already in useというエラーメッセージが表示されます。
- ソケットファイルは正しく生成されているようですが、アイコン表示からするとソケットファイルではないようです。問題の原因を特定できません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>なにがいけないのでしょうか。 bindはmkstempで作られた名前のファイルが既に存在する場合は、エラーを返します。従って、bindに与えるファイル名は、存在しないことが条件です。 mkstempはユニークなファイル名を生成すると同時にそのファイルのオープンまで行います。 従って、以下の作業が必要となります。 1)mkstempで作成されたファイルをクローズする。 2)クローズ後、削除する。 3)その後で、bindを呼び出す。 コーディングは以下のようになります。 int fd,ret; ・・・・ fd = mkstemp(client_name.sun_path); if (fd == -1){ perror("mkstemp failed"); exit(1); } ret = close(fd); //クローズ if (ret != 0){ perror("close failed"); exit(1); } ret = unlink(client_name.sun_path); //削除 if (ret != 0){ perror("unlink failed"); exit(1); } printf("socket addr:<%\n",client_name.sun_path); ・・・・・ 尚、 len = sizeof(struct sockaddr); // =16 は誤りで len = sizeof(struct sockaddr_un); // = 110 として下さい。 bindに与える3番目の引数は、client_nameのサイズです。