dポイントプレゼントキャンペーン実施中!

マッキントッシュOS-X上で動くTCP通信プログラムを作る場合について教えてください。
ウィンドウアプリを考えています。

ウィンドウ環境なので、アプリがフリーズしてしまわないために、
以下のような非同期処理が考えられます。
この場合、データが来ていなくても、while(1)がぐるぐる回るので
無駄にプロセスを食ってしまうと思うのですが、これはしかたのないことでしょうか。
もっとよい方法がるのでしょうか。

Winsockだとイベント応答関数での受信処理処理ができてエレガントなのですが、
バークレイソケットでは、どうすべきなのか疑問に思い質問させていただきました。
よろしくお願いします。


//ソケットを非同期モードにセット
val = 1;
ioctl(sock, FIONBIO, &val);

while (1) {
  memcpy(&fds, &readfds, sizeof(fd_set));
  select(2, &fds, NULL, NULL, NULL);

  // sockに読み込み可能データが届いている場合は、受信
  if (FD_ISSET(sock, &fds)) {
    memset(buf, 0, sizeof(buf));
    recv(sock, buf, sizeof(buf), 0);
  }
  else{
    //受信データがなかったときの処理
  }
}

A 回答 (2件)

selectの第5引数にNULLを指定していますが、ソケットに変化がない場合、無期限に処理をブロックします。


もしかして、これを0秒に指定しようとしているということでしょうか。
もしそうであれば、すぐに関数を抜けて、ぐるぐると回りますね。
でも、タイムアウトの時間指定が、以下のように、マイクロ秒単位で、できるので
struct timeval
{
 long tv_sec; /* 秒 */
 long tv_usec; /* マイクロ秒 */
};
多少でも待ちを入れれば、CPUリソースの消費は、抑えられるはずですが。
それが気になるようなら、データ受信専用のスレッドとUIスレッドを分けましょう。
    • good
    • 0
この回答へのお礼

ありがとうございました。

まさに、selectのタイムアウトをゼロの場合を聞こうとして
おかしな質問になっていることに気づきました。
別スレッドにする。。。なるほど、エレガントです。

あらためて、
winsockのイベント応答関数はよくできていると思いました。

お礼日時:2012/10/25 18:13

> データが来ていなくても、while(1)がぐるぐる回るので


> 無駄にプロセスを食ってしまうと思うのですが、これはしかたのないことでしょうか。

selectは、登録したソケットをブロッキングで監視し、無駄なCPUリソースを消費しない状態でデータの到着を待ちます。データを受信すると、selectより下の行を実行します。
なので、無駄にCPU資源を使用することはありません。
    • good
    • 0
この回答へのお礼

ありがとうございました。

selectのタイムアウトをゼロの場合を聞こうとして
おかしな質問になっていることに気づきました。

お礼日時:2012/10/25 18:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!