• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Linuxのsocket接続でacceptできない)

Linuxのsocket接続でacceptできない

このQ&Aのポイント
  • Ubuntu 10.10 + gcc4.4 + eclipse で C言語プログラミングをしています。ソケットを使用したプログラムを試していたのですが、サーバ側が accept したときに戻り値 -1 を返却して終了してしまうことです。
  • 作成したプログラムは以下のようなものです。ローカルマシン上で、サーバプログラム、クライアントプログラムを用意し、サーバ側はソケット作成後、クライアントが接続するまで listen します。クライアントはサーバに接続したら、接続した旨を表示します。
  • 上記のように、サーバ側が accept 時に -1 を返却しています。パーミッションについては以下になっています。おそらく環境周りではないかと思いますが、考えつきません。 linux プログラミングに詳しいかた、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

こちら、CentOS release 5.6 (Final) で確認しましたところ、正常に動作しました。 (new connection grantedのメッセージが表示されました。) >おそらく環境周りではないかと思いますが、考えつきません。 こちらで、再現しないので、環境の問題かと思います。 原因を特定するために、errnoを印字して確認しては、いかがですか。 (必ずしも特定できることが保障されるわけではありませんが・・・) 以下のようにしてください。 printf("sockResult = %d, sun_path=%s,errno=%d\n", sockResult, srv.sun_path,errno);

u_routine
質問者

お礼

アドバイスありがとうございました。 おかげで動作するところまでたどり着きました! 以下の手順で調査しました。 (1)アドバイスどおり errno を出力するようにして実行 $ sockResult = -1, sun_path=aaa, errno=22 (2)errno=22 は EINVAL ということだったので、accept の man より「ソケットが接続待ち状態ではない。もしくは、 addrlen が不正である」と判明 (3) 確かに accept の引数の socklen に値を代入していなかったので、srv を sizeof して代入 socklen = sizeof(srv); (4)実行したら成功! $ sockResult = 4, sun_path=aaa, errno=0 $ new connection granted ただ、こちらでも CentOS で動かしてみたら、確かに修正前のソースでも動作しました。 gcc のバージョンか、ディストリの違いによるのか(?)分からないのが気持ちが悪いですが。。。。 いずれにせよ、これで errno の使い方もわかりました。 ありがとうございました!

関連するQ&A

専門家に質問してみよう