ページ 1 / 1
コンソールアプリケーション→ Windowsアプリケーション
Posted: 2009年9月26日(土) 02:11
by ぬこ
ちょっとわからないことがあるので質問させてください。
現在winsock2をつかってネットワークプログラミングをしています。
MS-DOSプロンプト上で動くプログラムはだいぶできるようになったので、
今度はMS-DOSプロンプトではなくDXライブラリをつかってWindowsアプリケーションとして動作するようにしたいのですが、ここで詰まってしまいました。
基本的に問題なく動くのですがソケットをbindしようとするとなぜかその部分だけ動作が非常に重くなり止まってしまいます。
コンパイル自体は普通にできます。
bind部分でエラーコードを表示させてみたのですが何故エラーをはいているのかよくわかりません。
MS-DOSプロンプト上で動いてたプログラムと構成をまったく変えていないのですが何故なのでしょうか。
コンソールアプリケーション→ Windowsアプリケーションにすることで問題が発生しているとは思うのですが・・・
一応自分でもしらべてコンソールアプリケーションでしか使えないような関数は全部排除したつもりです。
どなたかわかる方、知恵を貸していただけないでしょうかorz
Re:コンソールアプリケーション→ Windowsアプリケーション
Posted: 2009年9月26日(土) 08:52
by zwi
私はMFCを使ったWindowsアプリケーションでwinsock2を使っていますが、これと言った問題も無く使えていますので別の問題点があるんじゃないかと思います。
エラーコードは、Visual C++エラールックアップ等で確認されてますよね?
それでも不明なエラーでしたらソースコード自体を貼っていただけると何かコメントできるかもしれません。
Re:コンソールアプリケーション→ Windowsアプリケーション
Posted: 2009年9月27日(日) 03:07
by ぬこ
zwiさん返答ありがとうございます。
Visual Studioについてるツールでエラーコード検索はしてたんですが内容を書き忘れていました。
説明不足で申し訳ないです
無効な引数が提供されました。
という結果になります。
sockの引数自体はコンソールアプリケーションの時と変えていません。
socket関数についても調べてみたのですがちょっとわかりません。
引き続きご教授をお願いします。
Re:コンソールアプリケーション→ Windowsアプリケーション
Posted: 2009年9月27日(日) 09:32
by zwi
ソースコードを見る限り2回bindしてますが、まずここが問題だと思います。やってもちゃんと動くかもしれませんが意味が無いですね。
それと表示ループの中にあるのは絶対だめです。それと途中でソケット閉じちゃてますのでループすると確実にエラーになりますよ。
このソケット受信ってウィンドウが開いている間、何度もする必要があるんでしょうか?もしあるなら、ループの中にあるべきはrecv()関数だけで他はループ外にあるべきだと思いますね。
とりあえず、winsockの理解不足が原因だと思いますので、winsockの1つ1つの関数の役割を理解するのが先決かなと思います。入門者向けの「猫でもわかるネットワークプログラミング」あたりを読まれるか、サイトを参考にしてください。いくつか紹介しておきます。
http://www.geekpage.jp/programming/winsock/
http://x68000.q-e-d.net/~68user/net/
winsock自体がプログラミングの初心者向けではないため親切なページが少ないのは否めませんので、ご容赦ください。
Re:コンソールアプリケーション→ Windowsアプリケーション
Posted: 2009年9月29日(火) 02:05
by ぬこ
zwiさんご返答ありがとうございます。
とりあえず指摘された箇所を直してみました。
結果として動きませんでした。
1回bindだと途中で処理が止まってしまうみたいです。
2回だとなぜか動きました・・・なんでだろうorz
とりあえずご紹介いただいた書籍を注文してきました
勉強しつつもうちょっとかんがえてみよーと思います。
Re:コンソールアプリケーション→ Windowsアプリケーション
Posted: 2009年9月29日(火) 07:50
by zwi
>1回bindだと途中で処理が止まってしまうみたいです。
>2回だとなぜか動きました・・・なんでだろうorz
とりあえず調べるとしたら、1回目のバインドのエラーコードをチェックしてみてください。
同じ事を2回する必要はまったく無いはずです。
あとはパケットキャプチャ(wiresharkなど)で、どんなパケットがやり取りされているか確認するのも重要です。
通信関係は地道なチェックをしないと不安定な通信ソフトが出来上がります。念のための動作確認は大事ですのでなんとなく動いたからOKってのはダメですよ。