Winsock2による通信でエラーが発生する。

[戻る]
Alq3 2010/08/22(日) 22:04:49
Vista SP2+VC++2005(MFC:ダイアログベース)で開発をしております。
http://msdn.microsoft.com/en-us/library/ms737593(v=VS.85).aspx
を参考にしてTCP通信のプログラムを作成しております。

サーバサイドプログラム(S)・クライアントサイドプログラム(C)を作成しました。
ルータおよびPCのポート開放設定をしたうえでプログラムを実行したのですが、

・Cを用いてループバックアドレス(127.0.0.1)でアクセスすると通信できる(Sが文字列
を受け入れている)
・ポートスキャンを行うと接続できる(SがAcceptしたことを通知する)

状況であるにもかかわらず
グローバルIPアドレスを使ってアクセスするとCはコネクトで失敗します。
WSAGetErrorを用いてエラー番号を調べると10061(Connection refused.)を返してきま
す。
原因としてどのようなことが考えられるでしょうか?

Alq3 2010/08/22(日) 22:09:14
追記:
ルータを介さずにPCを接続した場合にはグローバルIPアドレスを用いた場合でも
意図したとおりに通信ができています。

Ban 2010/08/22(日) 23:57:16
単純にpersonal firewallに引っかかってたりしませんか?
S機上のファイアウォールソフトは何をお使いですか。
とりあえずログ等を確認してみてはどうでしょう。

# それでだめならWiresharkで見るのが早いかも。

Alq3 2010/08/23(月) 01:00:49
Ban様

回答ありがとうございます。
ファイアウォールですけども、ウインドウズの自前の物のみを使っておりまして、
こちらにおいてもアプリケーション(S)のポート開放を行っております。
また、ポートスキャンを行った時に、SがAcceptしているということは、
ポートの開放が正しく行われていると考えているのですがいかがでしょうか?

Wireshark、今まで存じ上げませんでしたが使用を検討してみます。

Ban 2010/08/23(月) 01:57:01
> また、ポートスキャンを行った時に、SがAcceptしているということは、
・ポートスキャンを行うと接続できる(SがAcceptしたことを通知する)

スキャンというのはどういった環境で、どのマシンからどのように行っていますか。
別マシンからルータ越しに実施して実施して、
Sがそれを検出したと(ログ等で)通知したということでしょうか。
もしくは、例えばnmap等の実施結果でSが反応したと出ているのでしょうか。
(自機上からの接続と他機からの接続は区別されるかと思いますが、
 スキャンはSと別機上からルータを介して実施してもOKということですか)

> ルータを介さずにPCを接続した場合には
HUB経由orクロスケーブルで直結という理解で合っていますか。 

挙動を見る限りでは、ありそうなのが
・受信側S機の実行権限が足りないか、
・ファイアウォールの設定が合っておらず、実は拒否されている
・ルータの設定が間違っていて、実は拒否されている/届いていない
あたりだと思うのですが、一時的にでも閉鎖網にして
全機のファイアウォールをOFFにしてみるとどうなりますか。
また、admin権限で起動していますか、それ以外ですか。

# Wiresharkなら送受信する内容が見られますので、
# (TCPのプロトコルが分かれば)それで一発かと思います。

しま 2010/08/23(月) 02:15:17
ネットワークの構成がよく分らないので何が起きているのかがよく分りません

試験に使うPCは何台ですか?
 クライアントプログラムとサーバープログラムとは別のPCで動かして
 試験していますか?
 (「追記:」での試験は1台で行ったでしょうから除外していいです)
ルーターはどういうものですか?
 家庭用の、インターネットと家庭内の LAN とを結びつけるもの?
 もう少し高機能なもの?
 それ以外

試験で使ったグローバルIPアドレスは取得した固定IPアドレスですか?
それともプロバイダーが接続時に割り当てるIPアドレスでしょうか?

tetrapod 2010/08/23(月) 10:18:56
とりあえずこういうトラブルの解決にはネットワーク構成の正確な図が必須。
それなしでは答える側も妄想と憶測をめぐらすしかないので。

古いスレッドには追加発言できません。