• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c言語のaccept関数が待機を行いません)

c言語のaccept関数が待機しない

このQ&Aのポイント
  • C言語のaccept関数が待機しない原因を調査しています。
  • 現在C言語のプログラミングを勉強中で、ネットワーク通信のプログラミングに取り組んでいます。
  • サーバー側のコードでaccept関数が待機せず無限ループに突入してしまう問題が発生しています。

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

  • ベストアンサー
  • papagal
  • ベストアンサー率50% (7/14)
回答No.3

> 仰っていただいた通りにエラーを確認してみると、「WSAEFAULT」でした。 accept()の第3引数を初期化していなかったということですね。 第3引数は入出力両用の引き数なので、lengthをsizeof(sturuct sockaddr_in)で 初期化してから呼び出さなければならなかったということですね。 > ちなみに「NULL」を指定しなくても、while文をコメントアウトすると、 > acceptは待機しました。これはrecv()が呼び出されていないからなのでしょうか? accept()より後ろにあるwhile文の有無がaccept()の実行結果に影響するとは 考えにくいのではないでしょうか? まぁもっと大きなループで囲まれているならば別ですが while文をコメントアウトして実行した時に、スタックの状態に因り 偶々lengthがいい値になったからではないかと考えます。 おそらくlengthは自動変数ではないかと思いますが、 自動変数は初期化しないと、その値は不定です。

その他の回答 (2)

  • papagal
  • ベストアンサー率50% (7/14)
回答No.2

すみません勘違いしていました。 Windows上でソケットを使ったことがないので... > accept関数の戻り値を確認すると「INVALID_SOCKET」でした。 これはaccept関数が~0を返したという意味ですね。 で、socket()は正常終了していると... 当然bind()、listen()も正常に終了しているのですよね? では、accept関数が異常終了した時のエラーコードは見てみましたか? これを見ればどんなエラーが発生しているかわかると思うのですが

scanfprintf
質問者

お礼

ありがとうございました。 bind(),listen()も正常に終了していました。 仰っていただいた通りにエラーを確認してみると、「WSAEFAULT」でした。 調べてみると、lpSockAddrLen(&length)が小さすぎるとのことで「NULL」を指定してみると、 無事待機後、クライアントからのデータを受信しました。 int型のポインターを指定したのですが.... ちなみに「NULL」を指定しなくても、while文をコメントアウトすると、 acceptは待機しました。これはrecv()が呼び出されていないからなのでしょうか? recv()を呼び出さなければ通信できないと思うのですが.... この辺りを詳しくご存知でしょうか?

  • papagal
  • ベストアンサー率50% (7/14)
回答No.1

INVALID_SOCKETといわれているのですから、 まずsocket関数が正常終了しているか確認してはいかがでしょうか?

scanfprintf
質問者

お礼

早速のご回答ありがとうございました。 if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){ printf("ソケットの作成に失敗しました"); return; } でソケットの作成が正常に行われているか確認しましたが、特に問題はなさそうでした。 確認方法が間違っているのでしょうか?

関連するQ&A