トップページ⇒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/
0191デフォルトの名無しさん2006/01/21(土) 23:15:17
>>187
「TCP over IP」の意味で「TCP/IP」という言葉を使う人が、世界に一人も居ないと思ってるの?
それと同様の意図で「UDP/IP」と言うのは間違いだと言いたいわけ?
0192デフォルトの名無しさん2006/01/21(土) 23:16:42
すみません。>>190 で言ってるグローバルアドレスとはポート番号を含めたものです。
よろしくお願いいたします。
0193デフォルトの名無しさん2006/01/21(土) 23:30:26
|―――――――|
|  UDP  |  TCP  |
|―――――――|
|      IP      |
|―――――――|
0194デフォルトの名無しさん2006/01/21(土) 23:31:05
めっちゃずれてたw
0195デフォルトの名無しさん2006/01/21(土) 23:31:10
>>21
∧_∧         ミ ギャハッハッ ズレてる!ズレてる!
     o/⌒(. ;´∀`)つ
     と_)__つノ  ☆ バンバン




∧_∧         
     o/⌒(゜Д゜  )つ
     と_)__つノ
0196デフォルトの名無しさん2006/01/21(土) 23:32:42
>>191
>それと同様の意図で「UDP/IP」と言うのは間違いだと言いたいわけ?

こっちは世界的に見て少数派だろうなぁ。
UDP が over IP である事を厳格に明示したい場合ってどういう時?
0197デフォルトの名無しさん2006/01/21(土) 23:34:46
     m(・∀・)<この5円玉をじっと見つめてください
     |
     �D

     m(・∀・)<あなたはだんだんどうでもよくなる…
     /
    �D ))

     m(・∀・)<あなたはだんだんどうでもよくなる…
      \
      (( �D
0198デフォルトの名無しさん2006/01/21(土) 23:48:51
>>196
は?
あんた「UDP/IPは間違い」って言ってんだろ?
多数か少数かは関係ないだろ。
0199デフォルトの名無しさん2006/01/21(土) 23:55:03
>>198
誰と勘違いしてるのか知らんが、>>197 でも見て落ち着け。
ちなみに俺も、理由無しに UDP/IP なんて書いてる奴がいたら、ちょっと眉をひそめるな。
0200デフォルトの名無しさん2006/01/22(日) 00:01:18

  .-、 
 (,,■)
0201デフォルトの名無しさん2006/01/22(日) 00:22:16
>>190
1. TCPでも同様の技法は使える。
  非対称の接続を行う場合対称構造にはならない。
  (ただしTCPには対称に接続確立する方法がある)
2. NATルータは通常TCPとUDPを区別して管理しているので不能。

ちなみに、登録サーバがあるスタイルのものを、
UDP hole punchingと呼ぶ流儀もあるが、
http://en.wikipedia.org/wiki/UDP_hole_punching
portの利用方法のことだけを言う場合も多い。
http://muziyoshiz.jp/20041225.html

私は後者(の前者)をUCP hole punchingと読んでいる。
0202デフォルトの名無しさん2006/01/22(日) 01:06:44
ローカルアドレス入りのデータグラムををGatewayから
たくさん送出しちゃいました・・別に大丈夫ですよね?
ちなみに私は18歳女子高生(処女)です。
0203デフォルトの名無しさん2006/01/22(日) 01:11:36
残念、俺は非処女だよ。
0204デフォルトの名無しさん2006/01/22(日) 01:12:19
>>202
それはUDP/IPのパケットですね?
0205デフォルトの名無しさん2006/01/22(日) 02:17:22
Winsock+vc++でのWindowsプログラミングの練習中なんですが質問が何点か。
買った参考書では、一対一でのチャットのソフトではTCP/IPを、複数での
チャットソフトではUDP用いていましたが、TCP/IPで同様に複数でチャットを
するには、接続分ソケットを用意するということでしょうか?

それと、WSAAsyncSelectを使いメッセージ等を単一で処理をするのと、
マルチスレッド化してaccept()などを使用するのと、どちらが良いのでしょうか?
どちらとも、ということでしたら、理由などを参考程度にお願いします。
0206デフォルトの名無しさん2006/01/22(日) 02:20:04
WinsockFAQの、「どのIO戦略を使うべきか」でも見とけ
0207デフォルトの名無しさん2006/01/22(日) 02:23:35
>>205
はい、UDP/IPとちがって、TCPは接続指向ですから、
接続後とにその端点であるソケットが必要になります。
02082052006/01/22(日) 02:30:18
助かります、ありがとうございました。
0209デフォルトの名無しさん2006/01/22(日) 02:35:23
>>205 間違っているかも知れませんが、自分は以下のように理解しています。

TCPは基本的にクラサバで、サーバー側がListenしてクライアントがConnectする。
Listenしているポートには、IPアドレス.ポート番号さえ違えば、いくらでも接続できる。(例:Webサーバーのポート80)

0210デフォルトの名無しさん2006/01/22(日) 03:01:16
だってTCPの接続の識別子は、
<src IP, src port, dst IP, dst port>の四つ組なんですもの。
0211デフォルトの名無しさん2006/01/22(日) 05:09:31
>>202
どこかのサイトの誰かのローカルアドレスに届くだけだから大丈夫
0212デフォルトの名無しさん2006/01/22(日) 12:40:51
>210
いや、UDPだって同じだろ?
0213デフォルトの名無しさん2006/01/22(日) 12:49:12
>>210
UDPには接続はない。常に一方向である。
よって<dst IP, dst port>だけで目的のソケットまで辿り着く。
TCPはそうではない。<src IP, src port, XXX, 80>は何組みもありうる。
これが>>209が理解し、>>212が理解してないこと。

UDPで、<src IP, src port>にパケットを返すケース、
それは上位層(セッション、アプリケーション)の仕様なのである。
# UDP hole punchingは上位層の振る舞いを利用する。
TCPの場合は、TCP層で<src IP, src port>が相手であることがはっきりしている。
0214デフォルトの名無しさん2006/01/22(日) 13:29:18
よくわからんな。
TCPのsrcaddr:srcpotが信頼できて、UDPのは信頼できないってだけの話か?
それともUDP・TCPのソケットレイヤにおける動作の違いが言いたい?
TCPだって、相手にデータを返すのは上位層の役割。送信と受信で
TCPソケットを分けるような変態設計もできるわけだし。
0215デフォルトの名無しさん2006/01/22(日) 13:44:27
自分はUDPパケットの中身よく知らないんですが、ひょっとして、
物理的にも DstAddr、DstPort しか持っていないんですか?
0216デフォルトの名無しさん2006/01/22(日) 13:47:45
すいません。sage
0217デフォルトの名無しさん2006/01/22(日) 13:54:28
>>215
UDPパケットにも、ありますよ。
http://www.faqs.org/rfcs/rfc768.html

けどUDP層ではそれは使わないんです。
それがUDPとTCPのサービスの違いになっています。

> それともUDP・TCPのソケットレイヤにおける動作の違いが言いたい?

その動作はサービスの違いを反映しているんです。
OSIの言葉で言うところの、各層のエンティティのアドレスって考え方を理解してください。

>>210はTCPの極めて基本的な常識です。
TCPの接続を実現するためには四つ組を識別子に使わざるを得ないんです。
# <dst IP, dst port>が同じ接続を認めないといけないので。
UDPには接続がないので、そうではありません。

これを理解してない人はTCP/IPの基本を理解してないと言わざるを得ません。
0218デフォルトの名無しさん2006/01/22(日) 13:57:33
>>215
SrcAddrはIPヘッダに、SrcPortはUDPヘッダに。
0219デフォルトの名無しさん2006/01/22(日) 14:15:36
>>218
加えるにpseudo headerの中にSrcAddr, DstAddrもある。
0220デフォルトの名無しさん2006/01/22(日) 14:30:18
>よって<dst IP, dst port>だけで目的のソケットまで辿り着く。
は間違い。UDPでもconnect済みのソケットは、srcを区別して捨てるようになるから。
0221デフォルトの名無しさん2006/01/22(日) 14:31:18
> TCPだって、相手にデータを返すのは上位層の役割。

レイヤーが理解できていませんね。

ヒント: ACK パケット

>>219
え゛?
0222デフォルトの名無しさん2006/01/22(日) 14:37:40
この場合のデータとは、TCPのペイロード部分を指す。
ソケットレベルで無意味なACKは考えない。
そのために、パケットではなくデータという言葉を使ったんだから。
0223やっぱり、理解できていなかったか…。2006/01/22(日) 14:48:12
>>222
ふーん、そうなんだ。

で、誰がそんな話してるの?

独り言なら、チラシの裏へ…。
0224デフォルトの名無しさん2006/01/22(日) 15:11:35
TCP hole punching を発明?

http://homepage3.nifty.com/toremoro/p2p/firewall.html の下方にあるように UDP hole punching は UDP
でしかできないとなっています。でも以下の方法でやれば TCP でもできるのでは?...

1.STUN サーバー(グローバル状態)に接続して、自分の Address.Portを記録してもらう(サーバー用として)。

2.外部からつなぐ場合、STUN サーバーから Address.Portを取得して、UDP で「サーバー用にポートを切
  り替えて」というパケットを送る。

3.ポートを切り替える。

4.外部からTCPで接続する。

駄目でしょうか?
0225デフォルトの名無しさん2006/01/22(日) 15:40:15
>>224
> 3.ポートを切り替える。

が無理です。

>>224のように登録サーバを使うhole punchingなら簡単です。

双方自分のIPアドレス、ポート番号を登録して、
ローカルソケットには登録したIPアドレス、ポート番号をbindし、
同時に相手にconnectしにいけばいいだけです。

UDPでも全く同じコードで動きます。
0226デフォルトの名無しさん2006/01/22(日) 16:00:19
>>225

>ローカルソケットには登録したIPアドレス、ポート番号をbindし、

ポートを切り替えるといってたのはその事です。やはりできるのですね?

なんでこれをやりたいかと言いますと、単にNATの背後にある PC 同士で通信したいだけなんです。
でも、UDP でやると セッションとかパケットの並べ替えとかを UDP の上に作りこまないといけないと
書いてあり、場合によっては UDP の上で TCP を発明するぐらい作りこむ事になりかねないって事
だったんです。
でも TCP でも やりようによってはできるんですね。やる気でてきました。

ところで、Symmetric NAT のルーターって全体の何割くらいあるものなのですか?
Symmetric NAT は、ポート番号総当りで突破できるでしょうか?
0227デフォルトの名無しさん2006/01/22(日) 18:20:47
注意点としては、
・SYNパケットがhole punchingを行うことになるが、
相手がhole punchingする前にルータにSYNが到達した場合、
ルータの振る舞い、ルータの出したICMPを受けた時のプログラムの振る舞い。

一番簡単なのは中継サーバを使う方法。
0228デフォルトの名無しさん2006/01/22(日) 20:23:32
かなり難しそうですね。パケットを何万を投げると何とか攻撃になりそうだし...
中継サーバーが確実ですね。
0229デフォルトの名無しさん2006/01/22(日) 20:51:31
>>228
udpで実際 Punching holeやってるが
コネクション型のTCPでできるの?
0230デフォルトの名無しさん2006/01/22(日) 21:11:12
>229
すみません。あまりネットワーク詳しくない上に、確認する環境がないもので...orz
ただ、WEBで調査した結果、できそうだなと...

でも、ルータの変換テーブルへの記録され方が TCPとUDP で同じだとの前提ですが。(ConnNAT,Destricted何とかNAT,SymmetricNATなど)

方法としては単純で、以下の手順を行います。

1.PC-A から 外部の PC-B にクライアント接続します。PC-B は PC-B からみたリモートアドレスとリモートポートを取得します。
2.PC-A はローカルポートとリモートポートを逆にして、サーバーとして待機します。
3.外部の PC-X は PC-B から PC-A のアドレスを取得して、クライアントとして接続します。

UDP Hole Punching と違うのは、ポートを逆にする手順だけだと思います。    確認できたとしたら、是非教えて下さい。
0231デフォルトの名無しさん2006/01/22(日) 21:16:48
sage
0232デフォルトの名無しさん2006/01/22(日) 21:19:43
TCPのNATはちゃんとstateを見てるんじゃないのかなぁ。
0233デフォルトの名無しさん2006/01/22(日) 21:24:39
今時の賢い奴はシーケンス番号の重複もちゃんとチェックしているはずだしね。
0234デフォルトの名無しさん2006/01/22(日) 21:29:42
>>.230 ですが。

すみません。さっきの手順でつながるのは ConnNAT の場合だけでした。
DistrictedなんとかNAT (2種類) を考えた場合、 UDP Hole Punching と同じ手順が必要だと思います。
(UDP Hole Punching の手順に ポート逆転 を追加)
0235デフォルトの名無しさん2006/01/22(日) 21:32:57
>>232 >>233
まじですか?もうプログラムを作り変え始めてたのに。
調査はするけど詰めが甘い自分...orz
0236デフォルトの名無しさん2006/01/22(日) 21:55:07
さっきの手順をまとめ直してみました。 駄目ですかね...

1.PC-A から 外部の PC-O にクライアント接続して待機。PC-O は PC-O からみたリモートアドレスとリモートポートを取得します。

2.PC-B から 外部の PC-O にクライアント接続して待機。PC-O は PC-O からみたリモートアドレスとリモートポートを取得します。

3.PC-A から PC-B に接続する場合、PC-O に要求を出します。

4.相手方のアドレスとポートを取得した両方の PC は切断して相手方にクライアント接続します。
  接続は失敗しますが、自分側ルーターの変換テーブルに相手方とのレコードが残ります。(きっと)

5.PC-B はローカルポートとリモートポートを逆にして、サーバーとして待機します。

6.PC-A は PC-B にクライアント接続します。
0237デフォルトの名無しさん2006/01/22(日) 23:23:41
>>236
俺の認識だと
■UDPは非コネクション系だからNATはそのパケットが正規の
ものか認識できない IPアドレスでは
■送信した時のポートを覚えておいて、そのポートできたパケットを受け入れる
■送信したIPアドレスも覚えておく

TCPのコネクションだと相手のIP固定だからルーターも
アドレスで選別できるよね?



0238デフォルトの名無しさん2006/01/22(日) 23:32:43
>>237
ついでに
私が作ったのはTV電話だけど
UDPの欠落、順序違いはたまに発生するけど
頻度から考えてTCPの再発明までこったする必要ないと
思うが?
TV電話の音声・映像は逆に再要求で遅延がひどいパケットは
捨てたいからUDPが向いてるけど
>>236さんがリアルタイム性の強いものを作るならばUDPの方が
向いてるし、ファイル系の速度よりも信頼性を取るならば
リレーサーバーで十分と思うが
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を名乗っちゃいけない
■ このスレッドは過去ログ倉庫に格納されています