
現在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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ソケット通信 同じポート番号...
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
TCP/IPプログラミングでのselec...
-
UdpClient 送信元のIPアドレ...
-
UDPで受信スループットを測定
-
fsockopenのソケットが全然分か...
-
recv関数でフリーズしてしまう
-
ネットワークプログラミングに...
-
UDP通信におけるbind関数について
-
Macターミナルで実行中のプログ...
-
エクセルVBA 大容量CSVファイル...
-
FOM出版の公認テキスト&問題集...
-
vb.netでバッチ処理
-
VB 電卓 メモリー機能
-
Linuxでのシリアル通信について...
-
powershell を使いカレントディ...
-
VBA:CSVファイルの読出し手法...
-
.sb3のファイルを.sb2に変換す...
-
C# シリアル通信でデータ受信...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
Socket通信の0バイト受信について
-
Winsockで接続待ちタイムアウト...
-
ソケットのクローズについて
-
UDP通信におけるbind関数について
-
VB6のwinsockでconnectできない
-
エクセル VBA でのCOMポート...
-
SIPがNATを越えられない理由
-
ソケットでクライアントのipア...
-
UdpClient 送信元のIPアドレ...
-
ソケット通信 同じポート番号...
-
VC++でのソケット通信について
-
TCP/IPプログラミングでのselec...
-
ソケット通信
-
ソケットのrecvの戻り値が0
-
UDP通信する時に、相手にどうや...
-
vxWorks6.4を使用してソケット...
-
SendRequestでヘッダが受信され...
-
ソケットを用いた1対多通信につ...
-
どうか、POSTでのファイル転送...
おすすめ情報