マッキントッシュ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{
//受信データがなかったときの処理
}
}
No.2ベストアンサー
- 回答日時:
selectの第5引数にNULLを指定していますが、ソケットに変化がない場合、無期限に処理をブロックします。
もしかして、これを0秒に指定しようとしているということでしょうか。
もしそうであれば、すぐに関数を抜けて、ぐるぐると回りますね。
でも、タイムアウトの時間指定が、以下のように、マイクロ秒単位で、できるので
struct timeval
{
long tv_sec; /* 秒 */
long tv_usec; /* マイクロ秒 */
};
多少でも待ちを入れれば、CPUリソースの消費は、抑えられるはずですが。
それが気になるようなら、データ受信専用のスレッドとUIスレッドを分けましょう。
ありがとうございました。
まさに、selectのタイムアウトをゼロの場合を聞こうとして
おかしな質問になっていることに気づきました。
別スレッドにする。。。なるほど、エレガントです。
あらためて、
winsockのイベント応答関数はよくできていると思いました。
No.1
- 回答日時:
> データが来ていなくても、while(1)がぐるぐる回るので
> 無駄にプロセスを食ってしまうと思うのですが、これはしかたのないことでしょうか。
selectは、登録したソケットをブロッキングで監視し、無駄なCPUリソースを消費しない状態でデータの到着を待ちます。データを受信すると、selectより下の行を実行します。
なので、無駄にCPU資源を使用することはありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
SocketのSend関数でのCLOSEの検...
-
SerialPortのDataReceivedイベ...
-
【CAsyncSocket::OnReceive()呼...
-
winsockでソケット通信の開発を...
-
FormatMessageでのバッファサイ...
-
再現性の無いバグ
-
socket: recvはいつ,どれだけ...
-
exeファイルのセキュリティ。
-
winsock recvでデータの取得方法
-
C#で通信処理。応答がない場合...
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
アセンブラ言語の数字を数値に...
-
バックグラウンドのプロセスの...
-
メッセージボックスのボタン名変更
-
VBAの配列サイズとメモリに関して
-
機械語ダンプリストについて。
-
Mac 乗数の入力方法
-
VBSの処理中一旦処理を止めて再...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
socket: recvはいつ,どれだけ...
-
WriteFile()でのデータ送信がで...
-
winsockでソケット通信の開発を...
-
UDP処理のエラーについて
-
RS232C通信(PC⇔PLC)
-
シリアル通信の出力バッファと...
-
シリアルポート通信
-
SocketのSend関数でのCLOSEの検...
-
「スイッチングハブのバッファ...
-
シリアル通信 大きいサイズの...
-
Connection reset by peer
-
WinsockAPIのrecvfromの受信デ...
-
C#で通信処理。応答がない場合...
-
rs232cでの受信データ(mscomm)...
-
ソケット通信内 read関数について
-
Linuxでのシリアル通信について...
-
バイナリデータ受信時のデータ順
-
RS-232Cでバイナリデータを受信...
-
recv関数の受信結果について
おすすめ情報