![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
現在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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
UDP受信時の通信異常検知について
C言語・C++・C#
-
Winsockで接続待ちタイムアウトを設定する方法
C言語・C++・C#
-
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
-
4
socket: recvはいつ,どれだけ受け取るのか?
C言語・C++・C#
-
5
UDP通信におけるbind関数について
C言語・C++・C#
-
6
Connectエラーが出てしまう・・・。
C言語・C++・C#
-
7
UDP通信する時に、相手にどうやって自分のポート番号を教える?
Java
-
8
非ブロッキングソケットのrecvについて
C言語・C++・C#
-
9
ソケット通信 同じポート番号でn対1はできない?
C言語・C++・C#
-
10
WinsockAPIのrecvfromの受信データがおかしい
Visual Basic(VBA)
-
11
CAsyncSocketのOnConnectがスレッド内で反応しません
C言語・C++・C#
-
12
MFCでbitmapを背景にしてstaticテキストを透過させる方法
C言語・C++・C#
-
13
ExcelVBAでのwinsockの利用
その他(Microsoft Office)
-
14
MFCでOnPaintのタイミング
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
recv関数でフリーズしてしまう
-
ソケットのrecvの戻り値が0
-
エクセル VBA でのCOMポート...
-
カードリーダーのデータ受信方法
-
UdpClient 送信元のIPアドレ...
-
Socket通信の0バイト受信について
-
UDPの宛先ポートと送信元ポート...
-
UDP通信におけるbind関数について
-
Winsockで接続待ちタイムアウト...
-
Connectエラーが出てしまう・・...
-
WinSockを用いたUDP送受信ソケ...
-
UDP通信する時に、相手にどうや...
-
ソケットとそれに基づくストリ...
-
ソケットのクローズについて
-
ソケット通信 同じポート番号...
-
winsockでファイル転送
-
Winsockを使わずにVBでSocketを...
-
異なる言語間でのソケット通信...
-
マルチスレッドプログラミング...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
Winsockで接続待ちタイムアウト...
-
UDP通信におけるbind関数について
-
VB6のwinsockでconnectできない
-
ソケットのrecvの戻り値が0
-
ソケットのクローズについて
-
UDP通信する時に、相手にどうや...
-
Socket通信の0バイト受信について
-
recv関数でフリーズしてしまう
-
ソケット通信 同じポート番号...
-
CreateFile関数でCOMポートが開...
-
Connectエラーが出てしまう・・...
-
ソケットでクライアントのipア...
-
ソケットを用いた1対多通信につ...
-
UdpClient 送信元のIPアドレ...
-
WinSockでの通信プログラムがう...
-
SIPがNATを越えられない理由
-
ソケットプログラミングに関す...
-
相手のIPアドレスを取得する方法
おすすめ情報