bind と mkstemp
ソケットプログラミングの練習をしています。
OSはlinux(fedora core)です。
サーバーとクライアントの2つのプログラムを作成しました(とはいっても授業でやったものをうつしただけですが)。同一計算機内で、クライアントがおくったメッセージをサーバープログラム側で表示し、クライアント側にも返えすという単純なプログラムです。
そこでbind()にて不思議な問題が生じ困っています。
クライアントプログラムの一部分ですが、
struct sockaddr_un client_name;
sock = socket(AF_UNIX, SOCK_DGRAM, 0);
client_name.sun_family = AF_UNIX;
strcpy(client_name.sun_path, "clinent_XXXXXX");
mkstemp(client_name.sun_path);
printf("socket addr:<%s>\n",client_name.sun_path);
len = sizeof(struct sockaddr); // =16
if(bind(sock, (struct sockaddr *)&client_name, len) < 0){
perror("bind failed");
exit(1);
}
略
としています。なにが問題かというと、ユニークなアドレスを付けるために、mkstempをつかっているのですが、
bind failed:Address already in use
とでてしまいます。ソケットファイルがあらたに生成されているか確認すると、ちゃんとユニークなファイルができています(ですがこれはアイコン表示からするとソケットファイルではないみたいです)
ところが、mkstempをコメントアウトするとしてプログラムから除外すると、client_XXXXXX というソケットファイルがしっかりと生成され、エラーもおこりません。こちらのファイルアイコンはちゃんとソケットファイルのアイコンになっています。
なにがいけないのでしょうか。
お礼
おぉ!まさにこれです。 ありがとうございます。 BINDの最新版を導入するにあたって、作業計画書なるものに現行バージョンを記載する必要があったもので...。