トップページ⇒tech
1001コメント356KB

ネットワークプログラミング相談室 Port16

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/12/31(土) 14:07:24
主にソケットに関しての質疑応答スレッドです。

Programming UNIX Socket FAQ (日本語訳)
  http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
Winsock Programmer's FAQ (日本語訳)
  http://www.kt.rim.or.jp/~ksk/wskfaq-ja/

関連リンクは>>2-10辺り
足りなかったら適当に付け足してね

前スレ
ネットワークプログラミング相談室 Port15
http://pc8.2ch.net/test/read.cgi/tech/1128088448/
0052デフォルトの名無しさん2006/01/12(木) 23:50:59
>>48
>>47
0053デフォルトの名無しさん2006/01/12(木) 23:52:38
>>51
うちのはされない
0054デフォルトの名無しさん2006/01/12(木) 23:54:13
>>51
ARP
0055デフォルトの名無しさん2006/01/13(金) 00:01:33
>>54
すみませんが、もうちょっとヒントお願いします。
物分りが悪くてすみません。
0056デフォルトの名無しさん2006/01/13(金) 00:07:35
>>51
OSは?
インターフェース名で分からないの?

ちなみに「Ethernet」のMACアドレスはベンダーIDで始まってる。
http://standards.ieee.org/regauth/oui/oui.txt
http://coffer.com/mac_find/
0057デフォルトの名無しさん2006/01/13(金) 00:18:30
WindowsXPから、Linux(fedora core3)のシェルのコマンドとか自作のプログラムを
実行する方法ご存知でしたら教えてください。
0058デフォルトの名無しさん2006/01/13(金) 00:21:11
シェルのあるところにパスを通せばいいような・・・足りないか?
0059デフォルトの名無しさん2006/01/13(金) 00:32:51
>>56
OS書き忘れてました。WindowsXPです。
インターフェース名でわかるのですが、MACアドレスをユーザーに申請してもらうので、
LANカードのMACアドレスをください、といっても通じない可能性があるもので。
(そこで、MACアドレスを列挙してあげるアプリを使わせます。そのアプリで擬似NICのアドレスをはじきたいわけです)

リンクありがとうございます。早速見させていただきます。
0060デフォルトの名無しさん2006/01/13(金) 00:33:20
ssh使う
0061デフォルトの名無しさん2006/01/13(金) 00:39:18
>>57
http://homepage2.nifty.com/cs/linux_command/command/ssh.html
0062デフォルトの名無しさん2006/01/13(金) 00:40:24
57です。
みなさん、アドバイスありがとうございます。
sshで出来そうなのは実はGoogleで少し調べてみて、情報は得られていたの
ですが、sshはWindowsXPには標準では装備されていないようなんですが、
WindowsXP標準の機能で、実現する方法は無いでしょうか?
というのは、自作のVC++のプログラムから、Linux上の自作プログラムを
起動したいのです。よろしく。
0063デフォルトの名無しさん2006/01/13(金) 01:18:59
Fedoraでtelnetdなりrexecdなり動かしとけばいいじゃん
ちなみにFedoraでの設定方法はスレ違いなので、ここで聞くなよ
0064デフォルトの名無しさん2006/01/13(金) 01:20:55
CGIでできる事ならそっち使うな
0065562006/01/13(金) 01:40:59
>>59
いや、プログラム内でインターフェース(アダプタ)の名前(wszName)見れば、
ほとんどの疑似インターフェースは弾けるんじゃないの?
dwTypeとか, dwDescrもあるよね。

GetIfTable/GetIfEntry
0066デフォルトの名無しさん2006/01/13(金) 02:21:37
>>57
rshにすれば?
0067デフォルトの名無しさん2006/01/13(金) 04:29:09
次のように定義される gethostbyname_r

 int gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop);

name と ret は分かるんだけど、他の引数には何を指定したらいいの?
NULL でいい?
0068デフォルトの名無しさん2006/01/13(金) 08:00:54
>>67
http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/nss/bug-erange.c?rev=1.2&content-type=text/x-cvsweb-markup&cvsroot=glibc
0069672006/01/13(金) 11:24:37
>>68
ありがとう。参考になりそう。
とどのつまり、NULLじゃいけないってことかな?案外面倒だね。
特に buf のことがよくわからないだけに、どう扱ったらいいのかよくわからないよ。
でもそのコードを見る限り、必須なんだろうね。

ところでそのサンプル、free が無いけどいいのかな?
gethostbyname_r の中で解放される?
/* Allocate buffer, remember to free it to avoid memory leakage. */
なんてコメントがあるけど。
0070デフォルトの名無しさん2006/01/13(金) 11:36:42
自作のVC++のプログラムにssh組み込めばいいじゃん。
ライセンス回避もいろいろな手段が有るし、sshはソース有るよ。
0071デフォルトの名無しさん2006/01/13(金) 11:37:51
サンプル程度ならプログラム終了時にOSが解放するからfree書かないことが多い

クライアントアプリの場合も単発で終了するようなものなら書いてなくても動く

サーバーアプリの様に長時間連続稼動するものは当然メモリリークが起こる
0072682006/01/13(金) 16:53:15
>>69
> 特に buf のことがよくわからないだけに、どう扱ったらいいのかよくわからないよ。

MF-Safeにしたいから、gethostbyname_rを使うんだよね?

gethostbyname_rが利用するメモリを、gethostbyname_rを呼び出す側が用意する。
利用目的は帰り値の保存(hostent構造体には入りきらないもの)。

MF-Safeなインターフェースのメモリ管理には、
・メモリを呼び出す側が用意する。gethostbyname_r(glibc版)
・freeする関数も準備してある。getaddrinfo/freeaddrinfo
・スレッド固有メモリを使う。gethostbyname_r(一引数版)
などのパターンがある。

buf, ret, h_name, h_alise, h_addr_listを%dで出力してみれ
0073デフォルトの名無しさん2006/01/13(金) 16:57:03
>63
rexecでできました。
ただし、rexec実行後に毎回passwordを聞いてくるので、それを無しに
したいのですが。
0074デフォルトの名無しさん2006/01/13(金) 17:09:54
> ちなみにFedoraでの設定方法はスレ違いなので、ここで聞くなよ
0075デフォルトの名無しさん2006/01/13(金) 18:31:56
もしかすると既出の質問かもしれないのですが
開発を主にUnix(solaris)で行い、運用も同OSで行うようなもので
しかし時々Win2000 or XPでも使用するソフトをつくる予定です
その際に悩んでいることがあるのでおねがいします

Unixのソケット関数とWin32のAPIで明らかに仕様が違うため
共通で使うことができません

Javaを仕様すればソケット部分も含めて同じにできますが
C++を使用したいのでそれはできません

このような場合にはどう対処するのがただしいのでしょうか?
0076デフォルトの名無しさん2006/01/13(金) 18:38:17
違うところだけ、汎用インターフェースを持つモジュールにまとめる。
0077デフォルトの名無しさん2006/01/13(金) 19:51:41
#ifdef
0078デフォルトの名無しさん2006/01/13(金) 20:28:23
>>75
Java+JNI+C++
0079デフォルトの名無しさん2006/01/13(金) 20:28:58
>>72
> MF-Safe

MT-Safeのこと?
0080722006/01/13(金) 20:31:31
そう(w
寝転びながらタイプしていたから、Tまで指が届かなかったようだ…
0081デフォルトの名無しさん2006/01/14(土) 12:29:26
2つのPCをLANクロスケーブルで接続して
通信速度を計測したいと思いいろいろ考えているのですが、
スタンダードな方法ってありますか?
0082デフォルトの名無しさん2006/01/14(土) 12:43:22
pathcharなど
http://www.ittc.ku.edu/Projects/DREN/software/
0083デフォルトの名無しさん2006/01/14(土) 14:49:16
wwwのhtmlに接続して内容を保存したいんだけど
0084デフォルトの名無しさん2006/01/14(土) 14:49:50
>>83
wget
0085デフォルトの名無しさん2006/01/14(土) 16:17:23
LAN自体の測定はスマートビットとか使うけどね。
PCで測定すると、PCのベンチにも成ってしまう。

C++で動くヲレラッパーライブラリ作ればいいじゃん。
普通は有料フレームワークとかで吸収したりするけどね。
0086デフォルトの名無しさん2006/01/16(月) 01:55:57
このスレでよいかわかりませんが、質問させていただきます。
WinSockのVer2.2で、RAWソケットを用いたファイルの
送信ツールを作成しています。
>>6の一番下のリンク先のIP PACKET MAKERのIP,UDPをそのまま利用
して、送信するものをファイルから読み込ませるようにしました。

しかし、送信するファイルが大きいと、途中でエラーが発生してしまいます。
「途中」というのは次のような様子です。単位はバイトです。
パケット長 1000 ファイルサイズ 4721898 送信バイト 2266000
パケット長 1200 ファイルサイズ 4721898 送信バイト 2360400
パケット長 1000 ファイルサイズ 292739076 送信バイト 148693000

またエラー発生箇所は、
  make_udp_packet(&pPacket_udp->udp, src_ip, m_Sport, dst_ip, m_Dport, PacketLen-20, data_buf);

という、udpソケット生成関数内の
(make_udp_packet(struct udp* udp, UINT src_ip, USHORT src_port, UINT dst_ip,
               USHORT dst_port, USHORT len, char* read_buf)
という形式の関数です。)

wsprintf((LPTSTR)udp->udp_data, read_buf);  //ソケットデータ部にデータ書き出し

という部分のようです。もちろんこの前のほうが原因かもしれません。
わかりにくい説明だと思いますが、何かわかる方いましたら
よろしくお願いいたします。
ちなみに、IPレベルもいじれるファイル送信ツールを作ろうとしています。
そのようなツールをご存知ならば教えてください
0087デフォルトの名無しさん2006/01/16(月) 01:57:53
どんなエラーが起きるのかくらい書けこの呆けなすが
0088デフォルトの名無しさん2006/01/16(月) 01:59:03
winsock2で、サーバに繋がっているクライアントのLANケーブルを
引っこ抜いた直後にクライアントからsend()を実行すると戻り値が正常な
送信バイト数で戻ってきます
これを失敗扱いにしたいのですが、良い方法(ソケットの状態を取得でき
る関数等)ないでしょうか
send()の前にselect()を駆使するとできるのでしょうか
0089デフォルトの名無しさん2006/01/16(月) 13:58:13
回線速度の変化をシミュレートするためのサーバー
(クライアントとサーバーの間に配置しする)を
プログラミングしたいと思っているのですが、
参考にできるようなページはないでしょうか
0090デフォルトの名無しさん2006/01/16(月) 18:48:20
altqとかそう言う話?
0091魚チョコ2006/01/16(月) 21:43:09
>>88
ケーブルをすっこ抜いたのか……。そこまで試したことねえなあ。
ケーブル切れてんのに正常に戻ってくるってことは、
send() が送信バファーに送信データーをコピーしただけで戻ってきたってことでしょ。
select() を使っても、送信に関しては、そのソケットが正常に connect され、
送信バファーに空きがあって送信可能であるということしか分からない。
それに、送信データーがそのコンピューターから「出た」ことだけ把握しても、
相手との間に中継サーバーが介在してる場合、途中で握りつぶされて届かない
こともあるわけで、あまり意味がない。
確実に送信成功を検知するには、相手側に「受信完了」通知を出させるしかない。
エラーに関しては、たいてい send() 以外のソケット関数を呼んでるだろうから、
どれかがエラーを報告したら、WSAGetLastError() でも呼んで確かめればいいのでは。
0092魚チョコ2006/01/16(月) 21:51:43
>>89
要するに遅さ可変のプロックシーを作りたいということなのかね?
クライアントとの間に適当なプロコトルを定めて接続先を指定させ、
もたもた受信してもたもた送信――送受信バファーの分だけどばっ
と通信してあとおひるねするようなことになるだろうなあ。スィリアル
ポートを経由するようにすれば遅くできるけど遅すぎるかな。あとは
10BASE/T しかない旧式コンピューターを調達するとか。
0093デフォルトの名無しさん2006/01/16(月) 22:26:05
>>89
参考にするって言ったって、受けたパケットを他のイン
ターフェースに流すだけだからなぁ。
Cisco の Web でもみてネットワークスイッチの勉強
とかした方がいいと思う。

あと何のためにそんなもん作ってるのかわからんけど、
インターネット回線の擬似テストとかなら、てきとーに
パケットをロストするとか、パケットの順序を変えると
かの機能を入れておくといいかも。
0094892006/01/16(月) 22:51:07
回答ありがとうございます
0095862006/01/16(月) 23:07:34
書き忘れていました。遅れてすみません。
エラーですが、

pctmkr.exe の 0x7c950370 でハンドルされていない例外が発生しました
: 0xC0000005: 場所 0x0025795a を読み込み中にアクセス違反が発生しました。 。

という形で出ています。
OSはWindowsXP、また、VisualStudio7.1を使用しています。
よろしくお願いいたします。
0096デフォルトの名無しさん2006/01/16(月) 23:27:20
もしご存知の方がいたら教えてください。

Linuxのiptablesではパケットのアドレスやポートの情報をDNATやSNATで自由に書換えられますが、
同じことをWindowsで実現する方法はあるのでしょうか?

よろしくお願いします。
0097デフォルトの名無しさん2006/01/17(火) 00:01:08
>>86
> wsprintf((LPTSTR)udp->udp_data, read_buf);  //ソケットデータ部にデータ書き出し
>>95
> : 0xC0000005: 場所 0x0025795a を読み込み中
> にアクセス違反が発生しました。 。

read_buf の内容に '%' が含まれてるに一票。

>>88
ソケットはそもそもそういう物理的な障害等を隠蔽するよ
うに作られてるからなぁ...。
何でそんなことしたいのか書いたほうがいいと思う。

>>96
ある。
やり方は知らない。
0098デフォルトの名無しさん2006/01/17(火) 00:11:46
>>97
ソケットというかInernetだな。
電話みたいな強い接続指向のネットワークなら、切れたら分かるからね。
0099デフォルトの名無しさん2006/01/17(火) 00:15:42
> Inernet
< Internet
orz
0100デフォルトの名無しさん2006/01/17(火) 00:52:20
Innernet を hack しよう。
0101デフォルトの名無しさん2006/01/17(火) 01:00:20
×Innernet
○Inernet
0102デフォルトの名無しさん2006/01/17(火) 01:27:12
ワラタ
0103882006/01/17(火) 01:49:33
>>91
>>87
レスどうもです。
クライアントは、ある装置からRS232Cで信号を不定期に受信します
その信号をサーバに送信しなければならず、信号の送信漏れは許され
ないシステムなんです
クライアントからサーバへは一方通行の垂れ流しプロトコルの為
送信完了(サーバへ信号が届いた)を検知する術が分かりません
TCP/IPのACKが戻ってくるという話を聞きましたが、winsockでその
信号を検知する方法等があれば良いのですが。。
良い方法ご存知の方、お知恵を貸してください。
0104デフォルトの名無しさん2006/01/17(火) 02:01:14
>>103
setsockoptでLINGER短くしろ。

>>103
> 信号の送信漏れは許されないシステムなんです
> クライアントからサーバへは一方通行の垂れ流しプロトコルの為

そこが設計ミスなんだけどな。
どこまでが到達したか機械的に分からないわけだから。
0105882006/01/17(火) 02:48:13
>>104
逆にLINGERを0xFFFFに設定して置けば、ソケットは長時間クローズ
されないので、LANケーブルを再度接続した時にソケットに溜まっている
データが流れて行くのですかね
出勤したらすぐに試してみます
どうもありがとうございました
0106デフォルトの名無しさん2006/01/17(火) 07:23:56
UDPにしてプロトコルレベルのACK返した方がよくね?
0107デフォルトの名無しさん2006/01/17(火) 08:08:58
>>103
>その信号をサーバに送信しなければならず、信号の送信漏れは許され
>ないシステムなんです
送信してるなら、サーバが受信しようがしまいが関係ないwww
0108862006/01/17(火) 09:21:49
>>97
ありがとうございます。確かに、おっしゃられたとおりです。
一時的な解決策として、送信元のファイルにそのような文字が
入っていないものを使用したところ、確かにバイト数が大きくても
送信できました。wsprintfを何とかしてみます。
ありがとうございました。
0109デフォルトの名無しさん2006/01/17(火) 09:30:10
>>106
何故にUDP?
0110デフォルトの名無しさん2006/01/17(火) 21:53:42
普通UDPだな
0111デフォルトの名無しさん2006/01/17(火) 22:14:30
FAでTCPは使いづらい
0112デフォルトの名無しさん2006/01/17(火) 23:14:30
UDPではデータの到着順が保証されない。
→正常に受信できない可能性の増加
→再送の必要性増加
にならないか?
トラフィック量、双方のCPUの処理量的にそれが問題なければいいのかもしれないけど

それよりもTCPでプロトコルレベルでACK
正常に送信できない(受信できていない)場合はデータをバッファリングして、後で送信

>>105
バッファがあふれたら?
0113デフォルトの名無しさん2006/01/18(水) 00:00:22
>>108
> wsprintfを何とかしてみます。

て言うか、wsprintf() のマニュアル見たの?
そこで、wsprintf() 使ってるのは意味不明だよ。

>>112
釣りか?
tcp 使ってても、パケットレベルで見れば

> UDPではデータの到着順が保証されない。
> →正常に受信できない可能性の増加
> →再送の必要性増加

だよ。

個人的には、tcp の上で自前の ACK とか言ってる奴
は、ネットワークプログラマをやめた方がいいと思う。
0114デフォルトの名無しさん2006/01/18(水) 00:33:20
>>113
> tcp の上で自前の ACK とか言ってる奴

アプリケーションよってはアプリケーションレベルでコネクションを確認することは意味がある。 
TCPが接続されていることと相手のアプリケーションがどういう状態にあるかは関係ない。 
BGPもTCP上で自前のKEEPALIVEメッセージを流すよ。
0115デフォルトの名無しさん2006/01/18(水) 01:27:41
>>114
KEEPALIVE と ACK は全然違うぞ。
0116デフォルトの名無しさん2006/01/18(水) 01:35:35
>>89
遅レスかも知れんが、やりたいのは packet shaping ってこと?
ぐぐればそれなりに情報出てくるよ。Linux にもドライバやツール類あるし。
0117882006/01/18(水) 02:23:22
<報告>
たくさんのレスありがとうございます
LINGERをまず試してみたのですが、LANケーブルを切断後、
およそ10秒後にOS(WindowsXPproSP2)がソケットを強制破棄
した様子でLINGERは無視されました
TCPレベルのACKは取り方が分からなかったので試していません
今回は送信する信号のlengthが固定値のため、結局SNDBUFを
1信号分に設定することで送信エラー時は再コネクト後に前回
送信した信号から送信開始、という仕組みにしました
…と言ってもご指摘の通り、信号が出て行っただけでサーバへ
の到達は全く保障されていませんが垂れ流し仕様を作った設計者
も責任を感じているらしく了承してもらいました
0118デフォルトの名無しさん2006/01/18(水) 02:25:19
>>113
> 個人的には、tcp の上で自前の ACK とか言ってる奴
> は、ネットワークプログラマをやめた方がいいと思う。

お前がやめろ。是非やめろ。
0119デフォルトの名無しさん2006/01/18(水) 02:27:24
>>117
Windowsはlink downで、network adoptorが切断状態になるんじゃない?
0120デフォルトの名無しさん2006/01/18(水) 06:19:54
それは自分側のifについて。
相手側のifが落ちてもこっちに通知が来るのはそれなりに遅れる。
0121デフォルトの名無しさん2006/01/18(水) 09:25:35
>>120
>>88
0122デフォルトの名無しさん2006/01/18(水) 09:39:38
>>113
アプリケーションレベルのプロトコルによる。
電文のシーケンスエラーというのもあるからな。
ACK/NAKのハンドシェイクを入れといたほうが何かと安心。

>>88の問題もアプリケーションレベルでACK/NAKのやり取りをすれば解決だな。
0123862006/01/18(水) 13:03:10
>>113
wsprintfについてですが、
もともと>>6の一番下は簡単な文字列を送るプログラムらしいので、
そういう何かなのかとあまり考えずに使っていました。
一応、単純に第2引数のポインタで、UDPデータのアドレスを得るように
してみました。しかし、3バイト以外データが空で、アドレスを
埋め込んでしまったかもしれません。
プログラムの基礎が足りないようです。勉強します。

もうひとついいですか?1度に1500バイトを超えるデータを
単位としたくて、64kB以下を送信するフラグメントを作ってみました。
Etherealで観測すると、UDP IP IP IP... UDP IP IP IP ...
という形になっています。WinSock2の標準のUDPでもこれをしっかり
組み立ててくれるのでしょうか?まだUDPデータがしっかりしていないので
確認できないのですが・・・
0124デフォルトの名無しさん2006/01/18(水) 13:16:13
>>123
> まだUDPデータがしっかりしていないので確認できないのですが・・・

etherealが先かよ!
IPフラグメントでググレ。
0125デフォルトの名無しさん2006/01/18(水) 15:32:46
すいません質問なんですが、下記の項目はそれぞれどういう意味なんですか?
紹介されてるHP等あったら教えてください、



-send
-sendto
-recv
-recvfrom

-wsasend
-wsasendto
-wsarecv
-wsarecvfrom


0126デフォルトの名無しさん2006/01/18(水) 16:15:46
>>125
>>1
0127デフォルトの名無しさん2006/01/18(水) 22:55:46
>>122
> 電文のシーケンスエラーというのもあるからな。

tcp 上で?
プログラムがバグってるか、タコなプロトコルスタック
/デバイスドライバ/オペレーティングシステム でも使
ってるのか?
(まあ、過去にはそういう経験もしたことあるわけだが…。)

>>118 といい、痛い奴が最近多いのか?

> >>88の問題もアプリケーションレベルでACK/NAK
> のやり取りをすれば解決だな。

そんなことができれば、>>88 も苦労してないだうな。
0128デフォルトの名無しさん2006/01/18(水) 23:21:11
>>127
interoperabilityを考えたプロトコルなら普通(←言い過ぎか?)は
ACK/NAK相当の応答が入ると思う。
応答のタイムアウト等で>>88の問題にも対応できるし。
0129デフォルトの名無しさん2006/01/19(木) 00:21:49
>>128
ネゴシエーションとかのことを言ってるのかな?

ただそれは、通信路の話とは別の話で、例えば各々の
プロセスが共有メモリを介在して動く時にも必要な話だ
よね。

世の中、そういう階層の分離ができない奴がいて、
>>122 みたいに「ネットワークだから伝送エラーが起き
るな。なんとなく心配だから、ハンドシェークしておこ
う。」とか言う、勘違い君がいたりする。

> 応答のタイムアウト等で>>88の問題にも対応できるし。

⇒ >>103 クライアントからサーバへは一方通行の垂れ
     流しプロトコルの為
0130デフォルトの名無しさん2006/01/19(木) 00:42:27
>>127
>>129

0131デフォルトの名無しさん2006/01/19(木) 06:50:17
>>127
自作してるんじゃないの?
0132デフォルトの名無しさん2006/01/19(木) 11:28:49
ひょっとしてバインドアドレスが違えば同じポートでサーバソケット開けたりする?
0133デフォルトの名無しさん2006/01/19(木) 11:33:57
つ SO_REUSEADDR
0134デフォルトの名無しさん2006/01/19(木) 12:01:23
同一プロセス内でそれぞれ 127.0.0.1 と 192.168.1.170 (LANのアドレス) にバインドした
同じリスニングポートのサーバソケットを開けた。telnet 127.0.0.1 9999 でやった
時は前者のサーバソケットへ、telnet 192.168.1.170 9999 でやったときは
後者のサーバソケットへ接続。ふーんやっぱそうでつか。
0135デフォルトの名無しさん2006/01/19(木) 12:32:24
当たり前。
・TCP層のアドレスは<IPアドレス、ポート番号>。
・インターネットアーキテクチャではホストでなくインターフェースごとにIPアドレスを付ける。
の二つから。
0136デフォルトの名無しさん2006/01/19(木) 16:06:42
1. UDP のパケットを recv する
2. パケットをキューに入れる (別のスレッドに渡すため)
3. 1. に戻る

というループをしてるんですが、recv が終了して次の recv に入るちょっとした間に
到着したパケットって次で取得できるんですか? それとも取り漏らす?
0137デフォルトの名無しさん2006/01/19(木) 16:11:17
>>136
その「ちょっとした間」に来るパケットの量が、
(OSの)UDPの受信バッファよりも多ければ取りこぼす。
0138デフォルトの名無しさん2006/01/19(木) 16:21:41
>>137
サンキュー、パケット受信に入っていなくても OS がしばらくは持っててくれるわけね。
たまにパケット送りそこなってるらしいアプリがあって、しかも原因不明らしく、なぜか
受信側に嫌疑が振られてたんだけど、これで心置きなく突っぱねることができそうです。
0139デフォルトの名無しさん2006/01/19(木) 16:48:43
>>138
> たまにパケット送りそこなってるらしいアプリがあって、しかも原因不明らしく、

インターネットアーキテクチャでは、
途中にいるルータが破棄する可能性が前提なので、
パケットを受け損なうことがあると困るのであれば、
TCPその他で保障してやる必要がある。応答確認、再送など。

ルータは中間にいない場合も、HUBが破棄するかも知れない。

0140デフォルトの名無しさん2006/01/19(木) 17:18:56
>>139
困る困らないは別として、パケットが十分に低いトラフィックで受信側NICまで届いているのに
APでは取りこぼしていたりすると「実装不味いんじゃない?AP作り直せば」ということになるでしょう。
>>138はそんな感じなのでは?
0141デフォルトの名無しさん2006/01/19(木) 17:24:02
>>139
重ねてありがとうございます。マルチキャスト使って LAN 内のサーバ
探してまして、その応答部分ですね。

C: 起動。活動中のサーバを探すためにマルチキャスト
S: 自分が活動中であることを送り返す   ← ここ
C: 活動中のサーバのうち適切なところへ接続

サーバは常に何台か動いているので実害はないのですが、テストしてると
たまに起動サーバ数と応答数が合わないらしくて (再現性なし)。状況によっては
1〜2 台になったりもするんで、バグなら直しておかないと。
ほぼ同時に複数の応答パケットが返って来るんで、先の 「ちょっとした間」 で
取り漏れてるんじゃないかと疑われそうになったしだいです。

TCP のパケットエラーとかは皆無なんで、ネットワークのせいではなさそう
なんですけどね。というか送信側は別会社でソースぐちゃぐちゃだったんで
あれこれ別の理由を探してるのかなぁ、と…
どうもありがとうございました。
0142デフォルトの名無しさん2006/01/19(木) 19:35:15
ほぼ同時に多数から返事が返ってくるなら、イーサネットでの衝突、というやつで
UDPは喪失しているのかもしれないな。
0143デフォルトの名無しさん2006/01/19(木) 19:44:50
帯域が十分足りてるときにコリジョンでパケットが落ちるなんて
あまり考えられないけどなぁ・・・って普通に社内LAN通してるのか。
そりゃUDPなら落とすこともあるか。
0144デフォルトの名無しさん2006/01/19(木) 22:02:53
>>141
たまにと言うのがどれぐらいの頻度か知らんけど、
sniffer とか ethereal とかでモニタすると言う
のはどうだろうか?
0145デフォルトの名無しさん2006/01/19(木) 22:35:49
>>142
> イーサネットでの衝突
それはイーサネットレベルで検知・再送されるんじゃなかったけ。
0146デフォルトの名無しさん2006/01/19(木) 22:47:44
UDPなら落とすこともある
0147デフォルトの名無しさん2006/01/19(木) 22:54:34
>>146
イーサにとってUDPもTCPもないでしょう? それは別のレベルでの話。 イーサは16回
再送を試みるらしい。
0148デフォルトの名無しさん2006/01/19(木) 23:02:27
etherealみたいにパケットをキャプチャするのってどういう仕組みでパケットを読み取っているのでしょうか?
ソケットにのぞき窓でもあるんですか?
0149デフォルトの名無しさん2006/01/19(木) 23:30:20
あるんです
0150デフォルトの名無しさん2006/01/19(木) 23:44:49
>>148
ほらあれだよ
ネットにつながってるLANのコネクタを監視したらいいじゃん
無差別だったらプロミスキャスだったっけな
etherealの名前のままEthernetをどんなパケットも逃さず監視するって感じなのかな
どうやってそういう風なプログラミングをするのかは不明だが・・・
0151デフォルトの名無しさん2006/01/19(木) 23:54:41
イーサネットと言っても色々あります。
>>145>>147の言っているのは10Base-5とか昔の話じゃないの?

スイッチングHUBだって、キューが溢れたり、
内部バスの(バタフライなどの)スイッチングネットワークで衝突が起きたら捨て放置だよ。

http://www.cs.cmu.edu/afs/cs.cmu.edu/project/phrensy/pub/papers/AroraLM94/node7.html
■ このスレッドは過去ログ倉庫に格納されています