トップページ⇒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/
0239デフォルトの名無しさん2006/01/22(日) 23:47:22
>>237

>■送信したIPアドレスも覚えておく

Restricted Cone NAT       送信した相手のIPアドレスも覚える
Port-Restricted Cone NAT    送信した相手のIPアドレスとポート番号まで覚える

この場合は考慮しています。と言いますか、送信先を覚えない Conn NAT の場合
Punching する必要はなく、STUNサーバーからアドレス取得してアクセスできる。

 自分はそう理解しています。(ひとりよがり...)
0240デフォルトの名無しさん2006/01/22(日) 23:57:23
固定のポート使う仕様にした方が早いんじゃない?
0241デフォルトの名無しさん2006/01/23(月) 00:03:49
>>238

あ、TV電話興味あるー!
今作ってるのは簡単な会議システムで、ライブ映像(音声)とファイル共有、ホワイトボード共有などです。
ライブ映像(音声)以外はローカルで完成しているのですが、マウス移動情報が大量に流れるのでUDPが理想的なのですが。

>>238 さんはTV電話はどのような技術を利用されたのですか?

自分は以前 Flash Communication Server で作ったことはあるのですが、クラサバだし、サーバーソフト値上がり(600万円!)
 したので止めました。
 今は RTC で作成を始めたところです。

>リアルタイム性の強いものを作るならばUDPの方が
>向いてるし、ファイル系の速度よりも信頼性を取るならば
>リレーサーバーで十分と思うが

 また迷いが出て来ました...そんな気がしてたのですが。
 でも ルーター の変換レコードって 90秒程度で消えるというような文章を目たもので。
 KEEP-ALIVE 用のパケット送ってれば済む話?

 よしゃぁ!UDPを試してみます。
0242デフォルトの名無しさん2006/01/23(月) 00:07:30
ああ、ファイル転送があるのでした...orz
( ゚д゚)ハッ! それだけ STUNサーバー を経由するか?

ちょっと落ち着いてよく考えてみます。
0243デフォルトの名無しさん2006/01/23(月) 00:10:46
>>240

形態的にはネットゲームみたいにしたいんです。
ロビーで相手探して接続するというような。
0244デフォルトの名無しさん2006/01/23(月) 00:15:39
Kanzas, Nebraska みたいなのか

http://sumim.no-ip.com:8080/collab/20
0245デフォルトの名無しさん2006/01/23(月) 00:26:01
>244 同じようなものですね。

文書上に両方から書き込みができる、ズーム、移動等が同期で動くというどっかにありそうな。
場合によっては NetMeeting で事足りるじゃないかって言われるかも...orz
0246デフォルトの名無しさん2006/01/23(月) 00:33:26
http://www.distant-view.co.jp/product/co3/# と同じようなものです。
02472382006/01/23(月) 00:33:56
今はhole punchingやめました 最近安定しない
書くことたくさんあるけど・・・・

リモートツールも作ってます
■ルーターには数分に一度データーを流すことにより接続を維持します
■ファイル転送はTCPでサーバー経由で十分です
■マウスはUDPの方がいいです。TCPでは効率悪すぎます
 マシンスペック、回線により送る量の調整が必要となります
 単純なホワイトボードだとマウス情報送るべきではないよ
■今はUPnPを期待して逆向き接続にしてます、双方UPnPが使用できない
 時はリレーサーバー 複数人の場合は一人でもUPnPが使用できれば
 それをサーバーにします
■UPnPはルーターにXMLで直接送ります。それによりSP2は回避できます
■winsockではUDPは相手に一度でもつながらないと以後 ソケットは
 使用不可になるのでオプションで機能をOFFにします
 Hole Punching時の不到達前提で相手に送るときです
02482382006/01/23(月) 00:40:30
なんか 同じようなもの作ってるな・・・・
Hole Punchingは明日が予測できない技術だから
業務では使用しないほうがいいよ
0249デフォルトの名無しさん2006/01/23(月) 01:07:02
>247

貴重なアドバイスありがとうございます。

>マシンスペック、回線により送る量の調整が必要となります

そこなんですよね。バッファリングというか、ハンドルの遊びみたいな部分というか。
UPnPって操作したことないので全くわかりません。ぅw
確か、これから使うグローバルアドレス等をPGで指定できるんですよね。勉強します。

>248

ですよね。現時点でも Synmetric NAT は越えられない訳だし...
http://www.newrong.com/product/natsdk/ とかはどうなんでしょうねぇ?
0250デフォルトの名無しさん2006/01/23(月) 06:00:20
>>247
> ■マウスはUDPの方がいいです。TCPでは効率悪すぎます

TCP_NODELAYやOOBつーもんがあるが
02512472006/01/23(月) 09:10:39
>>250
すみません書き方悪かったです。本質的にはUDP,TCP関係ないです
回線的には書かれているようにTCP_NODELAYで乗り越えれます
レスの内容がリモートですので相手のマシンの処理能力に
影響される部分が多いです。時間情報つけて処理しきれない事に
気づいた時には回線上には大量のマウスデーターが順番待ちしてます

02522502006/01/23(月) 10:12:54
リアルタイム性を失ったデータは捨てていい、
むしろ捨てた方がいいという状況下で、
TCPはオーバースペックという話なら納得。
0253デフォルトの名無しさん2006/01/23(月) 11:51:07
auとかモバイルでオンラインアプリ開発するならどんな言語?
0254デフォルトの名無しさん2006/01/23(月) 12:46:13
PHPかJavaかperl
0255デフォルトの名無しさん2006/01/23(月) 12:52:50
perlとphpか
リアルタイムを選ぶならjavaしかないすよね(至#;)
0256デフォルトの名無しさん2006/01/23(月) 13:16:30
端末側の話ならこっちだな。

BREW(Binary Runtime Environment for Wireless) 7
http://pc8.2ch.net/test/read.cgi/tech/1137502541/
CLDC+MIDP+携帯電話用Javaスレッド part 5
http://pc8.2ch.net/test/read.cgi/tech/1132493827/

おまけ:
iモード携帯電話用Java(iアプリ) Part10
http://pc8.2ch.net/test/read.cgi/tech/1131603113/
0257デフォルトの名無しさん2006/01/23(月) 22:36:09
>>251
そういう状況だと、TCP_NODELAY は関係ない。
そのために、OOB つーもんがあるんだが。
02582472006/01/24(火) 09:08:45
>>257
単独に>>251だけ見た場合 そうですね誤解を受ける書き方ですね
ここまで掘り下げる話題でもないんだけど・・・・

リモートに関することでスレ違いだったのでハッキリかかなくてすみません
いらぬ誤解を生んだようです。

>>247でUDPの方が良いというのは訂正します。
TCPではできないというような印象を与えたようです
実際 私もTCPを使ってます(UDPの方が楽ですが)

>>250さんの言われている通りですが
マウスの生データーをTCPを使ってまで送る必要は無いということです
実際キャプチャするとわかりますが もの凄い数の微小データーが発生します
TCPですとデーターは一定の数まで送信されませんが 実際はTCP_NODELAYを指定しなくても
問題ないぐらいにデーター数は多いです。逆にTCP_NODELAYを指定すると
マウスデーター1つにつき1パケットになるので再送等のリスクは高まります
相手のマシンが たとえばwin98の低スペックの場合データーは処理しきれず
たまります。そこで>>257さんの言われるOut of Bandなわけですが
そこまでTCPの機能を駆使してもデーターを間引く事になります
相手の画面のホワイトボードにはカクカクした線がでます。
そのため、クライアント側でマウスのデーターは補間して送る必要があります

■マウスのデーターを生で送るべきではない
■もし送るならばUDPで十分(TCPでもかまわない)
■データーを落としたくなければアルゴリズムを見直す。
 (ここから先はこのスレッドと関係ないけど)
0259デフォルトの名無しさん2006/01/24(火) 13:14:38
OOBってTCP内UDPみたいな感じ?
0260デフォルトの名無しさん2006/01/28(土) 18:45:59
>>■マウスのデーターを生で送るべきではない

カーソル移動しなくてもデータが生成されるようなハードからの生データは
送るべきないだろうけど、座標情報なら送っていのでは?
XとかVNCでもそうやってるだろうし
0261デフォルトの名無しさん2006/01/28(土) 19:16:43
vncは端折ってる。
Xはraw bandwidth X拡張ってのがあった。それも端折る。

>>258はまじめだねえ。
0262デフォルトの名無しさん2006/01/29(日) 13:19:41
端折るってのは間引くってこと?
0263デフォルトの名無しさん2006/01/29(日) 14:07:36
ここで質問していいのか迷ったのですが、
現在、ある程度のjavaの勉強が終わったので、javaでネットワークの勉強を始めようと思っています。
最終的にはちょっとしたネットを使ったゲームができればいいなと思っています。

そこでいろいろ検索したのですが、ネットワーク初心者向けのサイトが見つからなかったので
「基礎からわかるTCP/IP Javaネットワークプログラミング」って本を買おうかと思っているのですが
他にオススメのとかご存知の方いるでしょうか。サイトとかでも教えていただけるとうれしいです。
0264デフォルトの名無しさん2006/01/29(日) 15:16:29
箸折る - [動] 料理のまずさに食事を投げ出して帰ること。
0265デフォルトの名無しさん2006/01/29(日) 22:53:31
はしょる と読みます。
0266デフォルトの名無しさん2006/01/30(月) 02:10:27
>>264
そんなことされるくらいなら唐辛子の持込を許可してやるよ。
0267海原雄山2006/01/30(月) 02:33:00
女将を呼べ!
0268デフォルトの名無しさん2006/01/30(月) 15:54:44
コンテンツデリバリーサーバーの、
キャッシュサーバーとしての機能のみを備えたもの
(ウェブコンテンツをキャッシュして、
 回線速度とコンテンツの内容からの即時性を元に、
 キャッシュされたものをクライアントに返すか、
 ウェブサーバーまで最新コンテンツをとりに行くか判断)
をプログラミングしたいと思っているのですが、
参考にすればいいページやソースコードなどあれば教えて下さい。
0269デフォルトの名無しさん2006/01/30(月) 16:08:48
>>268
> コンテンツデリバリーサーバーの、
> キャッシュサーバーとしての機能のみを備えたもの

それキャッシュサーバーやん。

http://www.squid-cache.org/Doc/FAQ/FAQ.html
http://www.squid-cache.org/Doc/Prog-Guide/
http://www.linux.or.jp/JF/JFdocs/TransparentProxy.html
http://www.squid-cache.org/related-software.html
0270デフォルトの名無しさん2006/01/30(月) 16:09:10
>>263
その本で十分じゃねえか? 分からなかったら本屋行って他の本買いまくれ。
分かるまで右から順番に買って行け。左からでもいいぞ。
0271デフォルトの名無しさん2006/01/30(月) 18:23:09
将来AMDのCPUにプロトコルスタック専用のCPUコアが乗るかもしれないというニュース
http://pc.watch.impress.co.jp/docs/2006/0130/kaigai237.htm

サーバで効果あるかもしれないな。
02722682006/01/30(月) 18:43:17
>269
回答&リンクありがとうございます。
0273デフォルトの名無しさん2006/01/31(火) 09:28:10
>>270
本屋に行くたびに順番が変わってたりして。
0274デフォルトの名無しさん2006/01/31(火) 13:46:35
>>273
それを防止したいなら全部大人買いだ。箱で買え。
本棚ごと買え。株式交換で本屋ごと買収だ。
0275デフォルトの名無しさん2006/02/01(水) 15:18:54
UNIX(Solaris)でソケットプログラミングをTCP/IP Sockets in Cという本を読んで勉強しています。
コードも一応うまく動いているようで、クライアント側で"hello"と打てばサーバー側がそれを受け取ります。
それぞれどういう役割をしているかなんとなく理解しているつもりです。

で、これを具体的に使った例が見たいんですが
「TCP/IP ソケット プログラミング」で検索しても
具体的な例はどこにも見つかりません。
なんか簡単な飛行機の予約システムとか
本を注文するシステムのような具体例が載っているリンク知りませんか?

"hello"とかサーバーの時間を調べるくらいじゃ全然面白くないんですよねぇ。
どうかお願いします。
0276デフォルトの名無しさん2006/02/01(水) 15:49:50
俺が出した結論はこうだ!
Visual C# for Win64API
Visual C# for JVM
つまり.NETはいらない。
ネイティブとジャヴァヴァーチャルマシーンで動くC#が最高。
そういうこと。
0277デフォルトの名無しさん2006/02/01(水) 16:24:58
>>275
テンプレにRFC集のリンクがあるからHTTPでもSMTPでも好きなの読め
0278デフォルトの名無しさん2006/02/01(水) 17:10:12
>>275
手近で具体的な使用例といえば、
いま>>275がレスを書き込んだ2ちゃんねるとか。
0279デフォルトの名無しさん2006/02/01(水) 18:58:58
linux 2.4.27 + pthread で tcp のメッセージを受け付けるプログラムを書いています。

サーバ側で accept したら thread を立ち上げるものです。
接続が1つの場合は問題なく動くのですが、同時に多数の接続を試みると、
双方の recv がしばしば期待(固定長サイズ受信)に反して 0 (EOF)を受信してしまいます。
送信側では send は正常に返っているようなのですが、どうも具合が良く分からないのです。

多数同時接続の時のデバッグするときはどうしていますか?
0280デフォルトの名無しさん2006/02/01(水) 19:07:30
>>279
send や recv は、戻り値を見てこんな感じで送る必要がありますが、
やっていますか?

int len = data_size;
char* p = data_ptr;
while (len > 0)
 int sent = send(socket, p, len);
 if (sent <= 0) エラー処理
 len -= sent;
 data_ptr += sent;
}
0281デフォルトの名無しさん2006/02/01(水) 19:08:18
>>280
>data_ptr += sent;
p+= sent の間違い。

要は、たぶん期待したデータサイズだけ送れていないのではないか、と。
0282デフォルトの名無しさん2006/02/01(水) 19:26:31
>>280-281

早速の回答ありがとうございます。
送り側のループ処理ですね!
受信側は recv を MSG_WAITALL で呼んでいたのですが、なるほど確認してみます!
02832802006/02/01(水) 22:32:09
もう少し精査してみましたが、送信部分はきちんとできていた様子です。
同時に一斉にアクセスをかけてみると幾つかの現象が生じるみたいです。

1つのホストでサーバ&クライアントを動かして、ログを元にペアとなったPIDを
順に追ってみると、サーバが存在しないプロセスに対して応答していることが分かりました。
以下は互いに通信した実際のPIDの組み合わせですが、サーバの20605
はいないはずの何かから accept して、意味のないデータを受信しているようなんです。
どの当りが影響しているのでしょう??

server-client
20603-20600
20604-20601
20605-????? ← クライアントは存在しないプロセス!?
20609-20602
20610-20606
20611-20607
20612-20608
02842802006/02/01(水) 23:17:47
自己フォローです。すいません。

accept して、pthread_create した直後に、usleep をちょっと挟んだだけで、上記不具合は
全く生じなくなってしまいました(いや、うれしいんですが)。どういうことなんでしょ。。。

if ( (s = accept(sock, 5)) != -1 ){
   pthread_create(XXXX);
   usleep(5000);
}
みたいな感じです。
0285デフォルトの名無しさん2006/02/01(水) 23:19:34
正直な話、コードも見せずに助言だけ求めるやつって何がしたいんだろうって思うよ。
俺はお前じゃねー通の
0286デフォルトの名無しさん2006/02/01(水) 23:25:57
>>284
send側に問題がないのなら、recvの処理に問題があるのでしょう。
MSG_WAITALL を使わずにループにしてみてはどうですか?
移植性も高まるし。
0287デフォルトの名無しさん2006/02/02(木) 01:20:07
>>284
問題の部分を引用しないと、なにが悪いか分かるわけないっつの
0288デフォルトの名無しさん2006/02/05(日) 18:33:42
C/C++の宿題を片付ケます 60代目から引っ越してきました

で、質問です
1 TCPソケット使って GET / HTTP/1.1 をHTTP鯖に送る
2 レスポンスが帰ってくる
3 データ部分に0f38とか、ソースに本来ないものが含まれる
さいしょ、chunk分けされたものかなーって思ってたけど、
RFCに載ってないのかよーわからん・・・

具体的なサイトは、このスレをtelnetでgetしてみると得られるかもしれません。

(とりあえずまんま元の質問をコピペ)
02892882006/02/05(日) 18:35:27
('A`) しまった・・質問本体書いてないじゃん

質問は、この0f38とか言う文字列が何を指しているのか、
最終的には回避したいので、回避する方法につながる何かの情報提供をおまちしておりまゥゥゥゥゥィ
0290デフォルトの名無しさん2006/02/05(日) 19:23:24
>>289
文字通りchunkじゃないの?
HTTP/1.1つけてGETしたんならchunk対応はMUSTなので
平気でchunkで送っていいことになってる。
対応できないんなら1.1を名乗っちゃいけない
0291デフォルトの名無しさん2006/02/05(日) 19:52:53
rfc2616の18ページとか、103ページとか。
02922882006/02/05(日) 20:01:27
>>290さんと>>291さん
レスさんくすっす ('A`)

とりあえずrfc再読します
HTTP1.1対応するの諦めよっかな・・・
0293デフォルトの名無しさん2006/02/05(日) 20:21:08
あとは ttp://www.studyinghttp.net/body#Codings かな。
0294デフォルトの名無しさん2006/02/06(月) 12:29:28
すみません、質問です。
UDPでサーバーにあるテキストファイルの内容を読むのは可能ですか?
もし可能であればどうすればいいのか簡単な流れを教えてください。
関連する検索キーワードでもいいです。
まさかfopen()やfread()はクライアント側からは使えないですよね・・・
0295デフォルトの名無しさん2006/02/06(月) 12:31:31
>>294
UDPを誤解してないか?
0296デフォルトの名無しさん2006/02/06(月) 12:36:12
はい、誤解しまくってると思います。
自分が分かっているのはUDPでコネクションレスの通信ができる、程度です。

もしかして、サーバー側にfopen()とかやらせるには
server.cの中でfopen("xxx.txt", "rb");なんて書いてやればいいんでしょうか?
でも、どのタイミングでやらせればいいんでしょう?
すみません・・・
0297デフォルトの名無しさん2006/02/06(月) 12:39:21
>>296
> UDPでコネクションレスの通信
その解釈は正しくて、UDPはそれ以上でもそれ以下でもない。

> サーバー側にfopen()とかやらせるには
やらせるには、サーバ側に
> server.cの中でfopen("xxx.txt", "rb");なんて書いてやればいいん
です。

> どのタイミングでやらせればいいんでしょう?
UDPで送信する前にやっておかなくてはいけませんね
ファイルの内容が実行中に変わらないのなら、プログラム初期化時にやっても良いですし
常に変動し続けるのなら、送信する直前にするのもいいでしょう
0298デフォルトの名無しさん2006/02/06(月) 12:47:59
ありがとうございます!
実はクライアント側からコマンドを打てばサーバー側でなんでもできると思ってました・・・(恥
ファイルの内容はもしかすると変動するかもしれないので、送信する直前にしてみます。
また質問することが「多々」あると思いますがよろしくお願いします。自分でももっと勉強しますから。
0299デフォルトの名無しさん2006/02/06(月) 12:51:49
>>298
> 実はクライアント側からコマンドを打てばサーバー側でなんでもでき
ます。
ただし、当たり前ですが全て貴方が実装しなくてはなりません
0300デフォルトの名無しさん2006/02/06(月) 13:10:20
>>299
あら、実装すればサーバー側でなんでもできちゃうんですね。
いらっしゃるなら、ついでにもう一つ質問を・・・
UDP(コネクションレス)ならマルチユーザーになった場合、
二人のクライアントが同時にサーバーにあるデータを変えてしまうような場面に遭遇しますか?

TCP/IP(コネクションあり)だとクライアントとサーバーが
一対一でつないでいる間は他のクライアントはつなげなかったんでしたっけ?
それならそんな場面に出くわすことはなさそうですが・・・
0301デフォルトの名無しさん2006/02/06(月) 13:13:08
( ´ー`)y-~~
0302デフォルトの名無しさん2006/02/06(月) 13:14:54
_| ̄|○
0303デフォルトの名無しさん2006/02/06(月) 13:21:57
>>300
> UDP(コネクションレス)ならマルチユーザーになった場合、
> 二人のクライアントが同時にサーバーにあるデータを変えてしまうような場面に遭遇しますか?
いやだから、UDPはover IPな通信路を築いているだけで、
サーバ側やクライアント側のアプリケーションプロトコルはまったく感知しないんですよ

貴方の言っていることをちょっと大きく言えば
1 神飛行機に「お願いです、命たすけてくだしあ」って書いて天空に飛ばしてみる
2 神が受け取る。けど助ける命いっぱいある
3 どれ先に実行すれば良いか悩む
4 もうpanicですよ
という1〜4の手順の中で、UDPに相当するのは”神飛行機”になります。
神飛行機が神の審判を助けたり、貴方のお友達を助けるわけじゃないですよね?
この「審判」や「助ける」のはover 神飛行機なアプリケーションプロトコルなので、
貴方が「審判」の実装や、「助ける」の実装をしなくてはならないのです。

> TCP/IP(コネクションあり)だとクライアントとサーバーが一対一でつないでいる間は
> 他のクライアントはつなげなかったんでしたっけ?
> それならそんな場面に出くわすことはなさそうですが・・・
んなことない
TCPのリスナは「待つだけ」で、「コネクションが到達」したら「接続されたソケットを作」ってまた待ち続けるだけ
0304デフォルトの名無しさん2006/02/06(月) 13:31:43
なんかもう無意味に色んな例えで説明したくなるな
でも多分なかなか分かってくれなさそう
0305デフォルトの名無しさん2006/02/06(月) 13:38:48
> 命たすけてくだしあ
0306デフォルトの名無しさん2006/02/06(月) 13:39:24
なるほど。ということは僕自身が
どのクライアントがどういうタイミングに来たときにどうするか決めてやらないといけないんですね。

>>TCPのリスナは「待つだけ」で、「コネクションが到達」したら「接続されたソケットを作」ってまた待ち続けるだけ

ああ!そうでしたね。
よく見たら、つなげられる上限を決める定数が上の方で定義されてました。
もっと勉強しときます。
図書館がそろそろ閉まるので今日はこの辺で。また来ます。ありがとうございました!
0307デフォルトの名無しさん2006/02/06(月) 13:44:19
>>306
一概に「アプリケーションプロトコルとは〜というもの」とは言えないけれど、
とりあえずステートマシン(=状態遷移を伴い、状態によって挙動が変わるプログラム)を組まなくてはならないと思う
まぁ、「どういう場合に問題が起こるか?」というだけで授業まるまる1つ使うくらいの物になるから、そのへんは勉強だわな

>>305
わすれてタタタタタタタ\\・・
0308デフォルトの名無しさん2006/02/06(月) 13:45:25
いや別に accept 受けてから listen に入らなきゃ同時に 2 接続が
発生することもないだろ。UDP もしかり。要は作り次第。
どうでもいいがエラく早く閉まる図書館だな。
0309デフォルトの名無しさん2006/02/06(月) 13:46:58
失礼、2接続の発生っつうか 2 つの処理が同時に走る、だな。
0310デフォルトの名無しさん2006/02/06(月) 14:07:58
割り込みスマソ。
今TCPでプログラム組んでます。
send()の直前でsetsockopt()でTCPヘッダのDSCP値を
変更してパケット出力をするプログラム書いてるのですが、
etherealでパケット確認すると、TCPヘッダのチェックサム値が
エラーとなってます。
受信先ではきちんとデータ取れてるんですが・・・。で、質問なんですが、

1.チェックサムの計算って誰がやるの?NIC?OS?ソケット?
2.チェックサムが異常のパケットって破棄されると思ってたんですが、
  受け取れるのはなぜ?(recv()もエラーになってない。)実は破棄
  されない?

全くもってわからず困ってます。どなたか俺の神飛行機を受け取って
助けてくださいorz。
0311デフォルトの名無しさん2006/02/06(月) 14:16:01
>>310
TCP/IPを実装しているのは、例えばNICとかルータとかだよな。
どの部分でTCPのチェックサムを処理しているかわからないけれど、
TCPのチェックサムでエラーが発見された場合は再送信するようになってるはず
受け取れるということはチェックサムが正しいことになるのでは?

と神飛行機に書いてとばしてみる
0312デフォルトの名無しさん2006/02/06(月) 14:34:14
>>311
レスありがとうございます。

>再送信するようになってるはず
そうなると再送要求のパケットが飛ぶはずですよね?
再送要求も出てないのですよね・・・。ethrealのバグか?
他のパケットキャプチャソフト使ってもうちょっと試してみます。

他にも回答頂ける方いましたらplz m(__)m
スミマセンがageで。
0313デフォルトの名無しさん2006/02/06(月) 14:35:40
>>312
> そうなると再送要求のパケットが飛ぶはずですよね?
うーん・・・どうだったかなぁ
なんだか再送信要求のパケットなんて飛ばなかったと思うんだが・・・
03143102006/02/06(月) 15:08:13
自己解決出来ました。書き込む前に試せよって話ですが、
現象が起きたのはLinuxの送信ポートのキャプチャを見てたのですが、
Windowsの受信ポートのキャプチャを見たら、正しいパケットでした。

Linuxの方のetherealのバグかは謎ですが、パケットを拾ってる
タイミングに問題ありなのかな?と思ってます。ちと実験で、
Windowsで送信する際にDSCP値書き換えた場合の送信ポートの
パケットとLinuxで受信したパケットを拾ってちと検証してみます。

再送要求のパケットなんてありませんでしたね(^^;失礼しました。
何分勉強途中なもので。
ありがとうございましたm(__)m

0315デフォルトの名無しさん2006/02/06(月) 17:35:12
いまどきCRCの生成はNICにオフロードされているので、それまでの間に
パケットをかすめ取っていると、CRCは当然合いません。
0316デフォルトの名無しさん2006/02/06(月) 18:42:58
>>306
> なるほど。

あの例えでわかったんかよ(ワラ

>>308
listenじゃなくて次のacceptだろ?
03173102006/02/09(木) 11:32:33
今更な遅レスですが。
>>315
>いまどきCRCの生成はNICにオフロードされているので
オフロードってどういうことですか?今時って事は昔は
また違ったのでしょうか?興味本位で教えてください。

また別の質問です。スイマセン(--ゞ。
TCP/IPの受信バッファのサイズはRWIN値で設定されているのは
わかりますが、このサイズを超えたデータを受信した場合は、
超えた部分は破棄されると考えて問題ないでしょうか?

例えばRWIN値が5KBとし1KBのデータが連続的に送られてくるとします。
最初の1KBのデータを受信し、そのデータに何らかの処理を行ってる最中
にもデータは送られてる訳で、6個目以降のデータは破棄されてしまうの
でしょうか?
RWIN値のMAX値って64Kだと思うのですが、1MBのデータ送った場合等、
受信速度>送信速度でない場合データ取りこぼしまくるんじゃないかと
思うのですが。

稚拙な質問ですが教えてください。
0318デフォルトの名無しさん2006/02/09(木) 11:33:56
>>317
> TCP/IPの受信バッファのサイズはRWIN値で設定されているのは
> わかりますが、このサイズを超えたデータを受信した場合は、
> 超えた部分は破棄されると考えて問題ないでしょうか
破棄される
その代わり相手が再送信する
あまりにも送信できないとタイムアウトで切断される
じゃなかったっけ?
0319デフォルトの名無しさん2006/02/09(木) 19:56:49
送信側はRWIN分はとにかく受け取れるのが判ってるから、RWIN分を連続して送る。
その後はACKが来るのを待つ。
それが伝送制御ってもんだ。

だからRWINが大きいほうがスループットが上がるんだよ。
0320デフォルトの名無しさん2006/02/09(木) 21:31:32
javaでキャッシュサーバをプログラミングする際に、
参考になるようなページを教えて下さい。
0321デフォルトの名無しさん2006/02/09(木) 23:06:42
>>317
Checksum Offload 機能でググれ

ただ、いつも>>315の通りなわけじゃない。(断言しているが)
0322デフォルトの名無しさん2006/02/09(木) 23:09:36
>>320
またか>>268
03233102006/02/10(金) 12:47:44
皆さんありがとうございます。
精進しますm(__)m
0324デフォルトの名無しさん2006/02/10(金) 18:38:01
http://pc8.2ch.net/test/read.cgi/tech/1103998649/508-509
で質問させていただいているものなのですが
ネットワーク関係はこちらのほうがよさそうなので
もし、よろしければ上記のアドレスの疑問なのですが教えていただけないでしょうか。
いろいろ試したところクライアント側の送信がゲームの毎フレームごとに
送信されておらず一定時間ごとに送信されてしまっているため
サーバー側で座標をクライアント側から毎フレームごと得られずカクカクしてしまっているようなのです。

win2k
VC#2003使用
通信部分はゲームのメインループから
・サーバー
try
{
Int32 port = 9999;
IPAddress localAddr = IPAddress.Parse("192.168.0.1");
server = new TcpListener(localAddr, port);
server.Start();
t= new Thread(new ThreadStart(receive));
t.Start();
}
catch
{}
・クライアント
t= new Thread(new ThreadStart(Con));
t.Start();
のようにスレッド化してあります
0325デフォルトの名無しさん2006/02/10(金) 18:44:37
なんかnagleアルゴリズムのお陰かもしれない雰囲気
でも、とりあえずどんな時間間隔でどれくらいのデータが送受信できてるのか確かめないとね
0326デフォルトの名無しさん2006/02/10(金) 18:47:49
>>324
C#はよく知らないが、世間で言うところの TCP_NODELAY オプションを
使うといいのではないかな。

03274112006/02/10(金) 21:13:29
ありがとうございます。
nagleアルゴリズム調べさせていただきTCP_NODELAYに関してもわかりましたが
オプションらしきものがMSのドキュメントを見てもわからないため
UDPでの通信をしてみようと思っています。
>>247
でマウスの位置を送るようなことが書いてあり
リアルタイムデータ送信ならUDPのほうがよいみたいですので。
また、何かありましたらよろしくお願いします
0328デフォルトの名無しさん2006/02/10(金) 21:16:50
>>327
setsockopt()とか無いの?

//儚いUDPを使う>>327の強気の態度に惚れるかもしれん
03293242006/02/10(金) 22:12:13
UDPで作成してみたところ
TCP使用時とほぼ同じ動きを行います。
ゲームの1フレームごとに通信が確立していない可能性が高そうなので
マルチスレッドの部分も含めて非同期通信部分を見直します。
03304112006/02/10(金) 22:17:41
また、わかったこととして
try catch構文で通信のエラーを破棄する処理を入れれば問題なく動く場合でも
try catch構文をはずすだけでエラーをはいて強制終了する場合がある。

スレッドを用いた場合は明らかに通信の回数が減っている
ただし、スレッドを用いない場合は通信受付待機の時間が
ゲーム画面の1フレームの更新時間にかなりの影響を及ぼし
ゲームにならなくなってしまう。
0331デフォルトの名無しさん2006/02/10(金) 22:28:58
非同期UDP使えばいいんじゃないの?
0332デフォルトの名無しさん2006/02/10(金) 22:31:12
>>331
逆に質問
同期UDPって何だ・・・
03333242006/02/10(金) 22:34:50
>>331
ありがとうございます。
なにぶん未熟なものでして、TCPで使っていた
マルチスレッドを利用したUDPの非同期?通信は試してみたのですが
TCPのときとさほどかわりませんでした。
今行っているゲームの通信部分は3Dモデルの主人公の動きを相手側でも
同じように再現するために座標を送っています。
0334デフォルトの名無しさん2006/02/10(金) 22:37:02
>>333
UDP結構使える?
うちのLANだと1〜2%ロスだったけど、WANに出ると正直どうなるかわからんのだ・・
0335デフォルトの名無しさん2006/02/10(金) 22:39:04
>>327
tcp_client_instance.NoDelay = true;
03363242006/02/10(金) 23:05:04
>>335ありがとうございます
client = new TcpClient("192.168.0.1", port);
client.NoDelay = true;
と定義できました。
しかし、動作は変わりませんでした。やはり非同期通信がうまくいっていないようです。

>>334
自分もLAN環境での実験ですが
やはりロスは出ているようです
0337デフォルトの名無しさん2006/02/11(土) 00:16:59
TCP_NODELAYと非同期通信は全く関係ないと思うんだが・・・。
0338デフォルトの名無しさん2006/02/11(土) 00:59:44
非同期通信って何なんだよ・・

あれか?
プログラムレベルで同期処理するのを同期通信って言うのか?
ならノンブロッキングソケット使ってるってことか?
■ このスレッドは過去ログ倉庫に格納されています