![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
現在Winsockを用いた簡単なパケット送受信のソフトを作成しています。
開発環境はVisual Studio2008で、ダイアログベースで作成しています。
パケットの受信側の処理なんですが、いつパケットが来てもいいように、
Ontimerで、定期的に受信処理をしようと思っています。
そこでOntimer内に以下のようにプログラムしたところ、コンパイルエラー
はないものの、数秒経つと応答なしとなりフリーズしてしまいます。
原因を探ったところrecv関数が原因で、recv関数をコメントアウトした
ところ、フリーズはしなくなりました。また、エラー処理は省略していま
すが、ソケットの作成失敗などはありませんでした。
なぜrecv関数でフリーズが起きてしまうのか、原因が分かる方は
いらっしゃいますか?
OnTimer(UINT nIDEvent){
WSAData wsaData;
SOCKET sock;
struct sockaddr_in addr;
char buf[2048];
WSAStartup(MAKEWORD(2,0), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
bind(sock, (struct sockaddr *)&addr, sizeof(addr));
memset(buf, 0, sizeof(buf));
recv(sock, buf, sizeof(buf), 0);
closesocket(sock);
WSACleanup();
}
No.4ベストアンサー
- 回答日時:
いつパケットがきてもいいようにという目的で、
OnTimerを使うのは、そもそも発想が違うというか。
確実にタイマ指定時間毎にOnTimerが呼ばれる保証はないんじゃなかったっけか。
受信専用のスレッドを立てて、その中で、
select, recvを使うのが一般的じゃないかな。
recvはブロッキング関数なので、データが受信されない限り
抜けてくることはない。つまりスレッドが1つのアプリならば、フリーズする。
まあ、それを避けるためにselectを使って、データが到着しているか
調査するんだけどね。
データが到着していれば、recvを呼んでもデータが受信されて、関数を抜けてくるので。
No.3
- 回答日時:
select()ではなく、WSAAsyncSelect()かWSAEventSelect()を使ってみてはどうでしょう?
もしど~してもselect()でやるのならば、ioctlsocket()をsoclet()の後で呼び出す手もありますが・・・
No.2
- 回答日時:
select()またはWSAEventSelect()を使用していないので、作成したダイアグラムソケットがブロッキングモードで動作しているからではないですか?
listen()はストリームソケットで使うもので、今回は該当しないでしょう。
他にもWSAStartup()とWSACleanup()をOnTimerに入れてるなど変なところもありますが・・・
この回答への補足
早速の回答ありがとうございます。
select関数は試していたのですが、select関数でも同様に
フリーズが起きてしまっています。
デバッグしてみても、select関数の文で動作がとまってしまいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- UNIX・Linux raspberry piを使ったWebサーバー制作をしています、接続するネットワークを変更したときに 1 2023/01/09 15:57
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
Winsockで接続待ちタイムアウトを設定する方法
C言語・C++・C#
-
UDP受信時の通信異常検知について
C言語・C++・C#
-
socket: recvはいつ,どれだけ受け取るのか?
C言語・C++・C#
-
-
4
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
5
UDP通信におけるbind関数について
C言語・C++・C#
-
6
WinsockAPIのrecvfromの受信データがおかしい
Visual Basic(VBA)
-
7
charからLPTSTRへの変換方法
C言語・C++・C#
-
8
Connectエラーが出てしまう・・・。
C言語・C++・C#
-
9
ExcelVBAでのwinsockの利用
その他(Microsoft Office)
-
10
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
11
非ブロッキングソケットのrecvについて
C言語・C++・C#
-
12
MFCでOnPaintのタイミング
C言語・C++・C#
-
13
C++によるファイル送受信プログラム作成について
C言語・C++・C#
-
14
画面を強制的に再描画させる方法
C言語・C++・C#
-
15
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
16
C言語での引数の省略方法
C言語・C++・C#
-
17
ソケット通信 同じポート番号でn対1はできない?
C言語・C++・C#
-
18
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
19
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
20
ソケットのrecvの戻り値が0
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
Socket通信の0バイト受信について
-
UDP通信する時に、相手にどうや...
-
ソケットを用いた1対多通信につ...
-
ソケットのクローズについて
-
エクセル VBA でのCOMポート...
-
Javascritpでソケット通信?
-
UDP/IPでのソケット作成につい...
-
POP3S
-
Socket通信を待ち受け状態にす...
-
VC6.0ソケット通信プログラムに...
-
ネットワークプログラミング ...
-
WINSOCKのWSACleanupについて
-
C言語でチャットプログラミング...
-
どうか、POSTでのファイル転送...
-
Winsockで接続待ちタイムアウト...
-
異なる言語間でのソケット通信...
-
UDP通信におけるbind関数について
-
ソケットを閉じる操作が・・・
-
VB6のwinsockでconnectできない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
UDP通信におけるbind関数について
-
recv関数でフリーズしてしまう
-
VB6のwinsockでconnectできない
-
UDP通信する時に、相手にどうや...
-
ソケット通信 同じポート番号...
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
Winsockで接続待ちタイムアウト...
-
ソケットを用いた1対多通信につ...
-
ソケットでクライアントのipア...
-
ソケットのクローズについて
-
相手のIPアドレスを取得する方法
-
SIPがNATを越えられない理由
-
Socket通信の0バイト受信について
-
CreateFile関数でCOMポートが開...
-
Connectエラーが出てしまう・・...
-
同じLAN内パソコンのIPアドレス...
-
送信したデータの一部が文字化...
おすすめ情報