|
返事ありがとうございます。 > - どういうリクエストを送ったのか > - 環境 (Windows など) > - 何を実行したのか (telnet でやったとか perl で書いたとか) > - どの URL を試しても同じ結果になるのか > - 実際のコードは (perl と C 以外わかりませんけど) 環境:UNIX 言語:C言語でproxyサーバにはsocket通信でリクエストを送っています。 具体的には以下の内容をsendで送っています。 GET http://www.yahoo.co.jp/ HTTP/1.1 Host:www.yahoo.co.jp (空行) ※proxyサーバが社内のマシンしかアクセスできない設定になっているので、 実際にはwww.yahoo.co.jpの部分は社内のhost名を指定しています。 >> ヘッダしか取出せません。 この後、もうちょっと調べてみると、 一度目のrecvでレスポンスヘッダが送られてきて、 二度目のrecvでエンティティボディが取出されることがわかりました。 NetscapeProxyServerの仕様なのでしょうか。 あと、レスポンスヘッダ文字列の大文字小文字ですが、 本などでは"-"の後の文字は大文字なのですが、 上記の環境で行うと小文字になります。 (例)「Last-Modified」→「Last-modified」など。。。 これもNetscape Proxy Serverの仕様なのでしょうか。 御存知のことがあれば教えてください。 |
|
> 一度目のrecvでレスポンスヘッダが送られてきて、 > 二度目のrecvでエンティティボディが取出されることがわかりました。 十分な量のバッファを用意して、十分なサイズを指定したからといって、 一度の recv で全てのデータを取り出せるという保証はありません。 これは read でも同じです。 http://X68000.startshop.co.jp/~68user/net/c-open.html の最後には > もし指定したファイルの長さが 600 バイトなら、 > 1回目のループ: read_size == 256 > 2回目のループ: read_size == 256 > 3回目のループ: read_size == 88 > 4回目のループ: read_size == 0 と書きましたが、これは相手がファイルシステムだからであって、 ソケット経由だと、 char buf[1000]; read(socket,buf,sizeof(buf)); としても、 1回目のread: read_size == 10 2回目のread: read_size == 20 3回目のread: read_size == 1 4回目のread: read_size == 0 などとなる可能性があります (この例ではデータ量は31バイト)。 要は IP パケットが細切れに送られてきたとき、read(recv) すると 要求されたサイズのデータが届くまで待つのではなく、そのときまでに 受け取っているデータを返すわけです。例えば echo サーバで、 $|=1; print(SOCKET,"a"); sleep(5); print(SOCKET,"b"); sleep(5); print(SOCKET,"c"); sleep(5); とすると、細切れなデータが送られるわけです。 > (例)「Last-Modified」→「Last-modified」など。。。 Netscape Proxy Server がわざわざ変換しているのか、 WWW サーバがそういうヘッダを返すのかはわかりませんが、 規格上は大文字小文字は区別されません (RFC のどこかに書いてあるはず)。 Last-Modified/Last-modefied/LaSt-MODIfied は同じように 扱わないといけません。 ちょっと用事があり、今日の夜から数日間 返答できませんのでよろしく。 |
|
> 一度の recv で全てのデータを取り出せるという保証はありません。 あ、これは read_size = recv(s,buf,sizeof(buf),0); のことです。 read_size = recv(s,buf,sizeof(buf),MSG_WAITALL); なら、全データを待ちますので、recv は1回だけ実行すれば OK です。 ただし MSG_WAITALL を指定しても、シグナル受信・コネクション切断時は、 全データを待たずに recv から戻ります。 |
|
ども、初めまして。とほほWWW−ラウンジから来ました。 「ネットワークプログラミングの基礎知識」が大変ためになります。 同様な事は書籍(ラクダ青本)にも書かれていますが、こちらがずっと解かりやすいです。 コンテンツ制作御苦労様です & 有り難う御座います。 ------------------------------ すっごく勉強になる解説のため、繰り返し読む事になるのですが、ベージ配色が、テキストが黒系統なく白系統であるため目が少々付かれます、またバックカラーとテキストの明暗が近寄っているのでこれも目に付かれる要因のような気がします。まっここいらは個人的嗜好の部分だと思います。 そういう事で、バックカラーとテキストカラーの指定を外部スタイルシートで指定させようと思い、その為には取りあえずコンテンツの階層を含めてローカルにダウンし、その後ローカル内で階層を跨いだHTMLファイルの修正をPerlで行う事にしました。 そういう事で、今、再帰的ディレクトリエントリサーチスクリプトを制作中です。。。。。 #いつも本題の前に、「あれやる、これやる」と時間がかかる私でした(笑) #ところで、68userさんは、とほほラウンジでの「B-cus」さんと同一な方でしょうか?、、、まっいらぬ詮索の範疇なのですが(^^; |
|
cksumコマンドについて知りたいのですが、 ��cksumコマンドはファイルに対してどういったチェックを行うで しょうか? �■淡生譴�らcksumコマンドを実行かけた時に、正常に終了したか、 もしくは、異常終了したかの判断は行えるのでしょうか? もし、行えるのであれば、詳細なエラー情報はどういったものが あるのでしょうか。 |
|
> ベージ配色が、テキストが黒系統なく白系統であるため目が少々付かれます であれば perl -pi.bak -e 's/BGCOLOR="#575757" TEXT="#FFFFFF"/BGCOLOR=white TEXT=black/' *.html などがお手軽です。 > まっここいらは個人的嗜好の部分だと思います。 前に「背景が黒/文字が白で読みやすい」と言われたこともあります。 人によって好みが違うので難しいですね。 > �´� 丸付き数字は機種依存文字なので、使ってはいけません。 > cksumコマンドはファイルに対してどういったチェックを行うでしょうか? http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/usr.bin/cksum/ を読んで下さい。なぜそういうコードになっているかを知ろうとすると ほとんど数学になってしまいますので、僕には説明できません。 > C言語からcksumコマンドを実行かけた時に、正常に終了したか、 > もしくは、異常終了したかの判断は行えるのでしょうか? system(3) の戻り値でわかります。0 なら正常、異常終了なら 戻り値を 8bit 右シフトしたものが終了ステータス (cksum が return したり exit した値)。 |
|
> cksum 日本語マニュアルを最初に紹介すべきでした。 http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=cksum&dir=jpman-3.3.0%2Fman |
|
>> �´� > 丸付き数字は機種依存文字なので、使ってはいけません。 そうそう、これ、研究室のFreeBSD環境では見えませんでした。 |
|
うーん、ちょっとめんどくさいけど、掲示板をいじって 機種依存文字をはじくようにしようかな…。 |
|
テストがてら、書き込み。wwwboard.cgi をちょこっと書き換えました。 ��Windows 機種依存文字を表示時に変換するようにしました。 本来、書き込み時に変換するのがベストですが、正しく変換できてるか どうか自信がないので、しばらくこれで様子を見ます。 ��二度書き防止機能を追加。最新10発言の MD5 を保存し、 重複していたら書き込みできないようにしました。 …と、あえて機種依存文字を使ってみたり。 今後、この掲示板では Windows 機種依存文字の使用を推奨します(^^; スクリプトはこちら。http://X68000.startshop.co.jp/~68user/cgi-bin/view-script.cgi/wwwboard.cgi |
|
はじめまして、とほほさんのところからお伺いさせて 頂きました。はじめまして。 早速ですが、自動変換された、 �� の 「(機種依存文字なので自動変換しました)」 の部分、長くて本文が読みづらいので、たとえば変換した 部分を今の赤色のまま、このページの下の方とかその他の ページとかにリンクを張って、そこに (機種依存文字なので自動変換しました) とか書いていただければ、あっさりして見やすと思うの ですが、いかがでしょうか? ご検討頂ければ幸いです。 |
|
確かにおっしゃるとおり読みにくいので、こんなふうにしてみました。 いかがでしょうか。 |
|
# はじめましてが、引用符みたいになってしまって、むっちゃ恥ずかしい・・・ 早速直して頂いて、ありがとうございます。かなり見やすくなったと思います。 しかも、変換した場合だけ注釈が出る、というところが、かっこいいですね。 関係無いですが、目立たせたいがために、わざとWindows 機種依存文字を使う ことも出来そうですね。 あと、「HTTPクライアントを作ってみよう」の 「さらなる改善点・バーチャルホストに対応」について、質問があります。 http://www.host2.com/index.html に対して、 GET /index.html HTTP/1.0 host: www.host2.com:80 とリクエストする例がありますが、RFC2616の2045行近辺を当てはめると、 この例ではポート番号はいらないように思われますが、いかがでしょうか? HTTP/1.0では必要なのかな、と思ってRFC1945を読んでみたんですが、どう しても探し当れられなかったので、単なる私の勘違いかもしれませんが・・・ 宜しくお願いします。 |
|
ご意見ありがとうございます。ftp://ftp.iij.ad.jp/pub/RFC/rfc2616.txt には、 3.2.2 http URL If the port is empty or not given, port 80 is assumed. とあるので、「80 なら省略すべし」と決まっているわけではないです。なので :80 は付けても付けなくても構いません。 ただ、確かに「80の場合は省略してもよい」というのは書いておいた 方がよいと思うので、直しておきます。 # が、これは Host: に限ったことではなく、URL 一般の話なので、 # どこで解説したらいいのか悩むところだなぁ…。 |
|
御回答、ありがとうございます。 なるほど、無い場合は80が仮定されるんですね。 http://www.host2.com/ の、 www.host2.com と全く同じ文字を、 host: の後に書く必要があるんかな、と 思ったのですが、常に付けていても問題ないのですね。わかりました。 また分からないことがあったら、質問させて頂きますので、その時は宜しく お願い致します。 |
|
こんにちわ!このHPで最近勉強させてもらってます! ところで、FTPクライアントをC言語で書く予定は無いのでしょうか? 一応見よう見まねでこのHPのパールで書かれたソースから Cで書いてみたのですが、見事失敗! (具体的にいうと、getsocknameの使い方がmanでしらべても よくわからなかったのです(泣)できれば教えてください!) ですから、説明無しでもソースだけアップしてもらえたらな〜、 なんて自分勝手なことを思ってしまってます。(ごめんなさい) あるいは、CでかかれたFTPクライアントをアップしている HPがありましたら、ご紹介いただけると幸いです! |
|
こんにちわ、はじめましてあっちーといいます。 最近自分のパソコンにLinuxを入れました。 でもコマンドの使い方とか全然わかりません。 なんとxWindowを立ち上げてサウンドの設定までできましたが CD-ROMが外付けなためCDROMびアクセスできません。 CDプレイヤーを立ち上げるとerorrと出てきます。 mountの設定なのでしょうか? パソコンはSony VAIOでPCG505Sです。 CD-ROMはPCGA-CD5です。 いきなり掲示板に書いた内容がこんなですが もしよろしければどなたか教えてください。 これからLInuxとUnixの勉強を始めていきます。 よろしくお願いします。 |
|
Kaiさんゑ。 単にFTPが使いたい、てだけならば CPANに行けばPerl用のFTPモジュールが置いてあるなりョ。 |
|
> 具体的にいうと、getsocknameの使い方がmanでしらべても > よくわからなかったのです(泣) 僕も知りませんでしたが、昨日から調べていてやっとできました。 struct sockaddr_in local_socket; int len; long local_ip; len = sizeof(local_socket); if ( getsockname(socket,(struct sockaddr *)&local_socket,&len) < 0 ){ printf("getsockname failed.\n"); } local_ip = ntohl(local_socket.sin_addr.s_addr); printf("PORT %d,%d,%d,%d,%d,%d\n", (local_ip >> 24) & 0xff, (local_ip >> 16) & 0xff, (local_ip >> 8) & 0xff, (local_ip ) & 0xff, (ntohs(local_socket.sin_port) >> 8) & 0xff, (ntohs(local_socket.sin_port) ) & 0xff); # わかってから man を読むと、何が書いてあるか理解できるんだけどなぁ。 > あるいは、CでかかれたFTPクライアント FreeBSD あたりなら ftpコマンド http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/usr.bin/ftp/ fetchコマンド http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/usr.bin/fetch/ ftpライブラリ(fetchがリンクしている) http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/lib/libftpio/ などなど。FreeBSD 以外の環境でコンパイルしようとすると 苦労するでしょうから、ソースを読むだけにしておくのがいいでしょう。 今回参考にしたのは (結果的には丸写しになってしまったけど) http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/lib/libftpio/ftpio.c?rev=1.33 です。 > CDプレイヤーを立ち上げるとerorrと出てきます。 > mountの設定なのでしょうか? mount は必要ないです。音楽CDを聞くには、 「CD-ROMドライブに何曲目を鳴らせ」 という指令を送るだけで、後は CD-ROM ドライブが勝手にやってくれます。 で、お使いのプレイヤーの -device とか -d とかのオプションで、 CD-ROM ドライブのデバイスを指定できませんか? # FreeBSD なら xcdplayer -device /dev/wcd0c とか # xcdplayer -device /dev/cd0c ですけど、Linux は知りません。 |
|
サンプルも作ってみました。anonymous ftp で、 ftp://ftp.jp.FreeBSD.org/pub/FreeBSD/README.TXT を取得します。 http://X68000.startshop.co.jp/~68user/tmp/ftp-client.c レスポンスコードは見ていないし、バッファオーバーランはするし、 RFCに準拠していないし、ファイルがなかったらデッドロックするしで、 バグだらけですが、改造してみて下さい。 |
|
おお!どうもありがとうございます!>68user様&むちなちゅぼ〜様 早速これを参考に頑張ってみたいと思います!!! ほんとうにありがとうございます!!! |
|
あんまり意味のない話題なのですが、、、、 Linuxのペンギン と FreeBSDのマスコット? (http://www.freebsd.org/gifs/freebsd_1.gif の右側のキャラクター) どっちが好きですか? 僕はFreeBSDの方なんですが。 FreeBSDといいつつLinux使ってるんですけどねぇ〜<僕 RPMのデータベース(?)が壊れて強制再インストールという事故にあった事があるので 今度OS乗り換える時は、68userさんおすすめのFreeBSDにしようかと。 |
|
> FreeBSDのマスコット? でーもん君 (daemon) です。手に持ってるのが fork で (fork(2) とかけている)、しっぽが (C言語の) ポインタだったかな。 > どっちが好きですか? うーん、描く人によりますねぇ。http://www.jp.NetBSD.org/ の でーもん君は憎たらしいし、Kondara Linux のペンギンは挑発的で かわいくないし (ペンギンにも名前あるんでしたっけ?)。 > おすすめのFreeBSDにしようかと。 誤解のないように言っておきますが、Linux を使ったことは ありません。なので、Linux と比べて FreeBSD がよい、という わけではないです。 ただ、あんなにディストリビューションが乱立した状況は 混乱の元であると思ってますので (30個くらいありますよね)、 あまり人には勧めたくないです。そういう意味で、まわりの人には 「Linux は使ったことはないけど、一本化されている FreeBSD の 方がいいんじゃないの?」 と言ってます。 あと、NetBSD やら OpenBSD なんかを使ってみるのもいいかも しれませんね。そこらへんを問題なくインストールできるなら、 少なくとも中級者でしょうから。 例えば NetBSD-1.4.1 (最新リリース) では、ユーザを登録する コマンドが標準で入ってないので、/etc/mastep.passwd を いじって pwd_mkdb することになります。 # もちろん登録コマンドをインストールする手もあります。 |
|
FreeBSD上で、Treeコマンドを使いたいのだけけれど、 どうしたらよいのだろう。 もし、よろしかったら教えて頂けないでしょうか? m(_ _)m |
|
tree ってどんなコマンドですか? # もしかして DOS の tree? |
|
> > FreeBSDのマスコット? > でーもん君 (daemon) です。手に持ってるのが fork で > (fork(2) とかけている)、しっぽが (C言語の) ポインタだったかな。 意味があるのかぁ〜 ナルホドー > > どっちが好きですか? > うーん、描く人によりますねぇ。http://www.jp.NetBSD.org/ の > でーもん君は憎たらしいし、Kondara Linux のペンギンは挑発的で > かわいくないし (ペンギンにも名前あるんでしたっけ?)。 確かに。(^_^) > NetBSDのでーもん やはり、僕はFreeBSDのでーもんがいいなぁ。 ペンギンの名前は知らないです。 > > おすすめのFreeBSDにしようかと。 > 誤解のないように言っておきますが、 (中略) > Linux と比べて FreeBSD がよい、という > わけではないです。 それはわかってます。 はっきりいって、OS換えるといってもぜんぜん決めてないのです。 始めはSolarisなんかにしようかと思ってたんですがこれは有料だそうで、、、、 その時、UNIXの部屋の > FreeBSD に乗り換えてみませんか? ;-) を見てFreeBSDにしようかと(^_^;;) あと、FreeBSDのでーもん君も気に入ったでポイントプラス。 |
|
はじめまして。UNIXに関して(その他もですが)ほとんど知識の無い私はかなり参考にさせていただいています。ありがとうございます。 いきなりで申し訳ないのですが、CGIの環境変数HTTP_REFERER についてお聞きしたい事が有ります。 HTTP_REFERER を使って、前ページ判断をさせているのですが、値の入り方が不安定で、思うように処理を行わせる事が出来ません。 68userさんのページでHTTP_REFERER はブックマークやURLの手打ちでは値が入らないと書いてあり、なるほどと納得したのですが、同じようにブックマークから飛んできても、値が入っている時と入っていない時が有るようなのです。それって、サーバの設定に問題があるのでしょうか。 つたない文章で、言っている事が良くわからないかもしれませんが、何かアドバイスをいただきたいと思います。お願いします。 |
|
> 始めはSolarisなんかにしようかと思ってたんですが > これは有料だそうで、、、、 Free Solaris などもありますが、まぁ入手経費はかかりますね。 >> FreeBSD に乗り換えてみませんか? ;-) > を見てFreeBSDにしようかと(^_^;;) なるほど。ということでしたら、ぜひ使ってみて下さい。 > HTTP_REFERER この値はあまり信用できません。ユーザがある程度自由にいじれる、 ということもありますが、IE ではブックマークや URL 直打ちで 飛んできた場合も、前に読んでいたURL (全然関係ない URL) が REFERER に入っていることがあります。 # 最新版では直ってるかなぁ? ではなくて、同じブラウザで、同じページを読んでいて、同じページに ブックマークで飛んでも、値が入っているときがあったり、入っていない ときがあったり、なんでしょうか。もしそうなら ちょっとわからないので、 http://www.wakusei.ne.jp/twn/wwwlng.cgi などで質問してみて下さい。 |
|
アドバイスありがとうございます。 教えていただいたURLに行って、色々読んでみました。 結局、HTTP_REFERER ってあんまり信用しちゃいけないんですね。 その値を使って、ページを振り分けるなんてことはあんまりしない方が良さそうですね。 そういう処理しようと思っていたんですけど、やめておきます(笑) アドバイス、本当にありがとうございました。 |
|
はじめまして 最近Perlでのネットワークプログラミングの勉強はじめたばかり初心者です。 PORT コマンドで送るPORT 番号がわからずにYahooで検索しまして こちらのサイトを発見しました。なんとアッサリ解決。ありがとうございました。 もうひとつわからない点がありまして,よろしければご指導ください。 FTPのユーザー認証で,USERコマンドを username@SERVER のような形で 送信しなければならないFTPサーバーがありまして,これがどうもうまくいきません。 ためしに, $username ='username@ftp.server.com'; print SERVER "USER $username\n"; といった形で送ってみたのですがどうしても530 User unknownと言われてしまいます。 どうしたら良いのでしょうか? 関係ないですが,私のPC98にはデーモン君シールがぺたぺたと12枚も貼ってあります(笑) 今は,Solaris7をAT互換機にいれてるのですが,FreeBSDに比べてなんか動作が重いです。 こっちは,P3-500なんですが。 |