- PR -

WinSock2ソケットプログラミングについて

投稿者投稿内容
ばーど
常連さん
会議室デビュー日: 2005/08/03
投稿数: 32
投稿日時: 2006-08-29 21:11
「Ethereal」というネットワークプロトコル・アナライザツールを用いて、パケットを観測してみたところ、B→A端末の際、B端末側からパケットが送出されていないことが分かりました。

もう少し試行錯誤してみたいと思います。

ポートは送受信とも、A,B両端末において9000番(固定)を使用し、ソケットは、両端末でそれぞれ一つずつ使用するということでしょか?
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2006-08-29 23:14
引用:
流用するというよりは、その方が一般的なのでは?


がーん。そうだったんですか。以前、SOCK_STREAM は全二重であるという説明を読んで、(対照的に) SOCK_DGRAM は全二重ではないと思い込んでいました。調べてみたところ、ちゃんとデータグラムソケットも全二重になっているのですね。

良い勉強になりました。ありがとうございます。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-08-29 23:19
引用:

ばーどさんの書き込み (2006-08-29 21:11) より:
ポートは送受信とも、A,B両端末において9000番(固定)を使用し、ソケットは、両端末でそれぞれ一つずつ使用するということでしょか?


固定でも変動でも、同じポートでも違うポートでも、
最低限お互いがひとつずつソケット作れば通信できますよ。

ところで、UDPで実装しようとしているのは勉強目的ですよね?
仕事で初心者がUDPで設計すると確実に悲惨な思いをすることに
なるので避けた方がいいと思いますよ。

少なくとも、TCPでは厳しい明確な事情がないのであれば。
ばーど
常連さん
会議室デビュー日: 2005/08/03
投稿数: 32
投稿日時: 2006-08-31 18:14
引用:

あしゅさんの書き込み (2006-08-29 23:19) より:

ところで、UDPで実装しようとしているのは勉強目的ですよね?


はい、勉強目的でおこなっています。

まだ解決できていません・・・
再度実行したい内容と現在の状況を記載します。

[実行予定内容]
1.A端末から「send」という文字列をB端末へ送信。
2.「send」受信後B端末からA端末へ「end」を送信。

いわゆる、A⇔B間におけるUDPベースの送受信です。

[現在の状況と未解決部分]
A→B端末への送信はOKですが、B→Aへの送信が不可能です。
ソケットは、各端末送受信用として2つオープンしています。ポート番号は統一しています。

コマンドプロンプト上で、
1.A端末側で、B側のIPアドレス,ポート番号。
2.B端末側で、ポート番号。
指定しています。

B端末側で、A端末側のIPアドレスを指定していないのは、B→Aへの文字列の送信の場合、Aから送信されてきたパケット内に含まれているIPアドレスからA端末側のアドレスを取得できると思っているからです。

おそらくこの部分が正しく動作していないのではないかと思っています・・・。

bind関数でサーバーのアドレスとポート番号を割り当てるのですが、A→Bへの際は、B側でbindさせ、B→Aの場合はA側でbindすることでいいのでしょうか?

[ メッセージ編集済み 編集者: ばーど 編集日時 2006-08-31 18:24 ]
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-08-31 18:56
引用:

ばーどさんの書き込み (2006-08-31 18:14) より:
bind関数でサーバーのアドレスとポート番号を割り当てるのですが、A→Bへの際は、B側でbindさせ、B→Aの場合はA側でbindすることでいいのでしょうか?



まず、UDPにはサーバーやクライアントという概念はありません。
コネクションレスなのでセッションという概念もありません。

#connect()も可能ですが意味がSOCK_STREAMの場合とは違います。

ローカルのアドレスとポートにbind()して、
sendto()の送信先引数で指定した相手に対してデータを送信できます。
recvfrom()はbind()したアドレスとポート宛てに送信されたデータを受信できます。

#connect()すると変わるのはこのあたりの挙動です。

メールで例えれば、

bind()がMUA(メーラー)に自身のメールアドレス等を設定すること。
sendto()がメールをSMTPで誰かに送信すること。
recvfrom()がPOPでメールを受信すること。

といったところでしょう。

ところで、Personal Firewallは止めていますよね?
製品と設定によっては遮断のログがあるかもしれないので、
確認してみるとよいと思います。
ばーど
常連さん
会議室デビュー日: 2005/08/03
投稿数: 32
投稿日時: 2006-08-31 21:00
引用:

あしゅさんの書き込み (2006-08-31 18:56) より:
ところで、Personal Firewallは止めていますよね?
製品と設定によっては遮断のログがあるかもしれないので、
確認してみるとよいと思います。



ファイヤーウォールははずしてあります。初めに、pingコマンドにて両端末が通信可能かどうかを見てから、プログラムの実行を行っています。

Etherealでパケットキャプチャをして、
A→Bは、1個
B→Aは、0個
でした。これはA→Bへ「send」という文字列を含めたパケットを一つ送信しているだけだからです。

一応B→Aへsendto関数を用いてパケットを送信しているつもりなのですが、Etherealではキャプチャできませんでした。

これは、どういうことを意味するのでしょうか・・・?Etherealが起動しているレイヤーまでパケットが到達していないのか、それともプログラムミスでパケット自体が送出できていないのか・・・。

自分自身のプログラムに自信がないので、そこを疑ってみたいと思います。

あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-08-31 21:52
http://pc8.2ch.net/test/read.cgi/tech/1148944560/622
どこで聞いてもその質問じゃ同じような回答返ってくるよ。

多分住人も同じようなもんだし(笑)
ばーど
常連さん
会議室デビュー日: 2005/08/03
投稿数: 32
投稿日時: 2006-08-31 22:03
引用:

あしゅさんの書き込み (2006-08-31 21:52) より:
http://pc8.2ch.net/test/read.cgi/tech/1148944560/622
どこで聞いてもその質問じゃ同じような回答返ってくるよ。

多分住人も同じようなもんだし(笑)


す、すごい。
そういう所もチェックしてるんですね!
ん〜、分かりました。
もう少し焦点を絞って、再度質問させて頂きます。

スキルアップ/キャリアアップ(JOB@IT)