>>3800 68user 68userさん、レスありがとうございます。 質問に答えさせていただきます。 (1)gcc をインストールしていますか? gccというもの自体はわかりませんが、fccとccはインストールしてあるみたいです。(すいません、学校のものなので・・・) (2)Sun のコンパイラをインストールしていますか? (/opt/SUNWspro/bin/cc などが存在しますか?) /opt/SUNWspro/bin/ccはディレクトリの中にありました。 (3)which cc と which ld の結果は? which cc:/usr/ucb/cc which ld:/usr/ucb/ld という結果でした。 (4)echo $PATH の結果は? /bin /usr/bin /usr/ucb /etc /opt/SUNWspro/bin /opt/FSUNf90/bin /disk2/user/md/gnuplot という結果でした。 (5)「あなたは」どのコンパイラを使ってコンパイルしようとしていますか? (gcc or Sun の cc) いままでの練習ではccでコンパイルしていました。これからもccでコンパイルするつもりです。 (6)実際に使用されていると思われるのはどのコンパイラですか? また、その根拠は? 上にも書きましたが、いままではccのコンパイラでコンパイルしていたので、ccのコンパイラだと思います。 さきほどgccについて調べた所、GNUが関連しているみたいでした。これから先にGNUplotを使用してグラフも書きたいと思っているのですが、 それについても何かアドバイスをいただければありがたいと思います。よろしくお願いします。 |
>>3801 どら あらそうですか。予想と外れていたのでもうひとつ追加で質問。 >>3790 どら > ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:... ここだけでなく、コンパイルしてからコンパイルが終わるまで全ての 部分を見せてください。Makefile を使っているにせよ、自分でタイプ したにせよ、とにかく全部見せてください。 > これから先にGNUplotを使用してグラフも書きたいと思っているのですが、 紛らわしいですが、gnuplot は GNU とは関係ありません。 GNU というのは、フリーなソフトウェアが大好きな FSF という団体が提唱するソフトウェアのライセンス方式の ことを指します。gcc も GNU ライセンスで配布されています。 しかし gnuplot はそうではありません。 あと、gcc と gnuplot は関係ないです。gcc はコンパイラ。 gnuplot はグラフ描画ソフト。 |
はじめまして、こんにちは。いきなりで非常に申し訳ないのですが、socketのインクルードファイルはどこでダウンロードしたらいいのでしょうか?もしくは、どのOSになら入っているのでしょうか? |
>>3803 鼈 わたしの知る限りでは、UNIX 系であれば標準で入っています。 Windows 系であれば、VC++ や C++ Builder などのコンパイラに 添付されているのかな? |
UNIXの<sys/socket.h>の様なファイルは windowsでどこにあるのですか windowsで<sys/socket.h>をインクルードしてもファイルが開けない というようなメッセージがでてしまいます。 |
> 秘密鍵: e, n > 公開鍵: d, n > 暗号化: (平文^e)%n > 復号化: (暗号文^d)%n > >として、今、平文と e が不明だとします。何をどうすると、 >何がどういうふうに循環すると考えておられますか? nを生成するのがp,qで、それらの最小公倍数がe,dだという私の認識自体が間違っていたのでしょうか^^; 一定の頻度で循環しているから、それ以内の適当な数eでべき乗しても補完関係にあるd(最小公倍数-e)で復号化できる。 平文に「1,2,3・・」といった具合に数を代入していけば循環周期が分かるのでは?と思ったのです |
>>3805 蒲鉾 > UNIXの<sys/socket.h>の様なファイルはwindowsでどこにあるのですか winsock.h ですが、Windows の場合は他にもいろいろと書き方が 異なります。「winsock」で検索して、よさそうなサンプルを 探してください。 もっとも信頼できると思われるサンプルは http://www.kt.rim.or.jp/~ksk/wskfaq-ja/examples/basics/ でしょうが、ライブラリ化してあるのでわたしは初心者には わかりやすいとは思いませんが、もし理解できるならこれを 参考にするのがよいでしょう。 >>3806 kou > nを生成するのがp,qで、それらの最小公倍数がe,d 誤りと思われます。 http://x68000.startshop.co.jp/~68user/net/crypt-2.html の「RSA の本当のところ」を読んでください。 もう少し正確に、かつ数学的に書くと、 p,q: 素数 n: n=pq e: 1<e<(p-1)(q-1) かつ gcd(e, (p-1)(q-1))=1 を満たす自然数 d: 1<d<(p-1)(q-1) かつ de≡1 (mod (p-1)(q-1)) を満たす自然数 として求めます。 # gcd(e, (p-1)(q-1))=1 は、e と (p-1)(q-1) が共通の約数を持たないということ。 # de≡1 (mod (p-1)(q-1)) は、d*e を (p-1)(q-1) で割った余りが 1 であるということ。 |
>>68user 何度もありがとうございます。 “ex3-2.c”というファイルを“keisan3-2”としてコンパイルした結果を載せさせていただきます。 -------------------------------------------------------------------------------- tds1% cc -o keisan3-2 ex3-2.c ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:/opt/SUNWspro/WS 6U2/bin/../lib:/opt/SUNWspro/WS6U2/bin:/usr/ccs/lib:/usr/lib は ld に渡されます 。それ以外は無視されます "ex3-2.c", 16 行目: 警告: ファイルの最後に改行文字がありません ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。 --------------------------------------------------------------------------------- 以前実行した時はうまくいったのですが、いつの間にかできなくなりました。 あと、上の文章の中で“16行目:〜ありません”という警告文もどのプログラムにも発生するみたいです。(この警告も以前はありませんでしたし、ファイルの中身はかえてないはずです。) 一応、簡単な文章でもうしわけないのですが、プログラムも載せさせていただきます。(教科書のコピーです…) --------------------------------------------------------------------------------- /* 【例題3.2】 rei3_2 */ #include <stdio.h> main() { int a,b; printf("異なる2つの整数を入力してください--->"); scanf("%d %d",&a,&b); if(a > b) printf("%d --- BIG\n",a); else printf("%d --- BIG\n",b); return(0); } ----------------------------------------------------------------------------------- よろしくお願いします。 |
>>3808 どら たびたびすみませんが、 % sh -x /usr/ucb/cc -v -o keisan3-2 ex3-2.c の結果 (全文) を教えてください。 あと、env の結果も教えてください。ホスト名やログイン名などを 公開するのが嫌なら、適当に削ってから提示してください。 これ以上引っ張ると怒られそうなので、一部回答しておきますが、 > ucbcc: 警告: ld が起動される場合は、... 無視されます > ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。 これは警告なので、実行には支障がないはずです。keisan3-2 が 生成されていませんか? > "ex3-2.c", 16 行目: 警告: ファイルの最後に改行文字がありません これは文字通り、ファイルの最終行が改行コードが付いて いないのでしょう。ファイルの最終行の末尾で改行してください。 ファイル末尾に改行がないとその行を読んでくれないプログラムも あるので、改行をつける癖をつけておくことをお勧めします。 |
>>3809 68user 何度もありがとうございます。このミスが見つからないと先に進みづらいので、教えていただけるのなら、どれだけ質問されても怒ったりしません。むしろどれだけでも聞いてください。お願いします。 % sh -x /usr/ucb/cc -v -o keisan3-2 ex3-2.cの結果を下に書きます。 ------------------------------------------------------------------------------ + [ -f /usr/ccs/bin/ucbcc ] + [ 4 -eq 0 ] UCB_LIB_DIR=/usr/ucblib CCS_LIB_DIR=/usr/ccs/lib USR_LIB=/usr/lib TYPE= dopt= cgdir= + [ x = x ] LD_RUN_PATH=/usr/ucblib + export LD_RUN_PATH + [ = -Bstatic ] LIBS=-lucb -lsocket -lnsl -lelf -laio + + awk/usr/bin/ls -ln /usr/ccs/bin/ucbcc{print $11} cclink=/opt/SUNWspro/WS6U2/bin/acc + /usr/bin/dirname /opt/SUNWspro/WS6U2/bin/acc ccdir=/opt/SUNWspro/WS6U2/bin + [ != ] nccdir=/opt/SUNWspro/WS6U2/bin/../lib:/opt/SUNWspro/WS6U2/bin LD_LIBRARY_PATH=/usr/ucblib:/usr/ccs/lib:/usr/lib + export LD_LIBRARY_PATH + /usr/ccs/bin/ucbcc -Xs -YP,:/usr/ucblib:/opt/SUNWspro/WS6U2/bin/../lib:/opt/SU NWspro/WS6U2/bin:/usr/ccs/lib:/usr/lib -v -o keisan3-2 ex3-2.c -I/usr/ucbinclude -lucb -lsocket -lnsl -lelf -laio ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:/opt/SUNWspro/WS 6U2/bin/../lib:/opt/SUNWspro/WS6U2/bin:/usr/ccs/lib:/usr/lib は ld に渡されます 。それ以外は無視されます ### コマンド行ファイルおよびオプション (展開済み): ### -v -o keisan3-2 ex3-2.c -I/usr/ucbinclude -lucb -lsocket -lnsl -lelf -laio ### ucbcc: 注釈: LM_LICENSE_FILE = (null) ### ucbcc: 注釈: NLSPATH = /opt/SUNWspro/WS6U2/bin/../lib/locale/%L/LC_MESSAGES/ %N.cat:/opt/SUNWspro/WS6U2/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat /usr/ccs/lib/cpp -undef -D__SunOS_5_8 -D__SUNPRO_C=0x510 -Dunix -D__unix -Dsun - D__sun -D__BUILTIN_VA_ARG_INCR -D__SVR4 -Dsparc -D__sparc -I/usr/ucbinclude ex3- 2.c >/tmp/cpp.20856.0.i /opt/SUNWspro/WS6U2/bin/acomp -Qy -y-o -yex3-2.o -I/usr/ucbinclude -g "/opt/SUNW spro/WS6U2/bin/acc -Xs -YP,:/usr/ucblib:/opt/SUNWspro/WS6U2/bin/../lib:/opt/SUNW spro/WS6U2/bin:/usr/ccs/lib:/usr/lib -v -I/usr/ucbinclude -c" -b -y-fbe -y/opt/ SUNWspro/WS6U2/bin/fbe -y-xarch=generic -y-xmemalign=4s -y-verbose -Xs -D__SunOS _5_8 -D__SUNPRO_C=0x510 -Dunix -Dsun -Dsparc -D__unix -D__sun -D__sparc -D__BUIL TIN_VA_ARG_INCR -D__SVR4 -y-s -I/opt/SUNWspro/WS6U2/include/cc -i /tmp/cpp.20856 .0.i "ex3-2.c", 16 行目: 警告: ファイルの最後に改行文字がありません rm /tmp/cpp.20856.0.i ### ucbcc: 注釈: LD_LIBRARY_PATH = /usr/ucblib:/usr/ccs/lib:/usr/lib ### ucbcc: 注釈: LD_RUN_PATH = /usr/ucblib ### ucbcc: 注釈: LD_OPTIONS = (null) /usr/ccs/bin/ld -o keisan3-2 /opt/SUNWspro/WS6U2/lib/crti.o /opt/SUNWspro/WS6U2/ lib/crt1.o /opt/SUNWspro/WS6U2/lib/values-xs.o -Y P,/opt/SUNWspro/WS6U2/lib:/usr /ccs/lib:/usr/lib -YP,:/usr/ucblib:/opt/SUNWspro/WS6U2/bin/../lib:/opt/SUNWspro/ WS6U2/bin:/usr/ccs/lib:/usr/lib ex3-2.o -lucb -lsocket -lnsl -lelf -laio -lc /op t/SUNWspro/WS6U2/lib/crtn.o ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。 rm ex3-2.o ret=0 + exit 0 ------------------------------------------------------------------------- envの結果も書かせていただきます。 ------------------------------------------------------------------------- HOME=/disk2/user/md PATH=/bin:/usr/bin:/usr/ucb:/etc:/opt/SUNWspro/bin:/opt/FSUNf90/bin:/disk2/user/ md/gnuplot:. LOGNAME= HZ=100 TERM=vt100 TZ=Japan SHELL=/bin/csh MAIL=/var/mail/md LANG=ja _INIT_NET_STRATEGY=none _INIT_PREV_LEVEL=S _INIT_RUN_LEVEL=3 _INIT_RUN_NPREV=0 _INIT_UTS_ISA=sparc _INIT_UTS_MACHINE=sun4u _INIT_UTS_NODENAME= _INIT_UTS_PLATFORM=SUNW,Sun-Blade-1000 _INIT_UTS_RELEASE=5.8 _INIT_UTS_SYSNAME=SunOS _INIT_UTS_VERSION=Generic_108528-27 PWD=/disk2/user/md USER=md LD_LIBRARY_PATH=/opt/FSUNf90/lib:/opt/SUNWspro/lib MANPATH=/opt/FSUNf90/man:/opt/SUNWspro/man ------------------------------------------------------------------------- という結果でした。 >>ucbcc: 警告: ld が起動される場合は、... 無視されます >>ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。 >これは警告なので、実行には支障がないはずです。keisan3-2 が >生成されていませんか? はい、ファイルはできています。実行すれば結果も出力されています。ただ、毎回この警告文がでていて、どれぐらい問題なのかどうかもわからないので、できるかぎり問題を取り除くことと、その理由が知りたいので… >ファイル末尾に改行がないとその行を読んでくれないプログラムも >あるので、改行をつける癖をつけておくことをお勧めします。 初めてしりました。ありがとうございます。気をつけます。 あと、もしお手数でなければ、今までされた質問の意図を教えていただければありがたいと思うのですが…手間がかかるようでしたら全然かまいませんので、よろしくお願いします。 それではまたよろしくお願いします。 |
>>3810 どら 結局、よくわかりませんでした。 Solaris の /usr/ucb/cc はシェルスクリプトで、/usr/ccs/bin/ucbcc を起動しています。/usr/ccs/bin/ucbcc は /opt/SUNWspro/WS6U2/bin/acc へのシンボリックリンクになっているはず。ですから、 ucbcc: 警告:... というのは acc が出力しているわけです。 コンパイラは http://x68000.startshop.co.jp/~68user/unix/pickup?gcc にあるように、プリプロセス・コンパイル・アセンブル・リンクという ステップを踏みます。提示していただいた例だと、最初に /usr/ccs/bin/ucbcc (実体は /opt/SUNWspro/WS6U2/bin/acc) が実行され、それが /usr/ccs/lib/cpp (プリプロセッサ) /opt/SUNWspro/WS6U2/bin/acomp (コンパイラ) /usr/ccs/bin/ld (リンカ) を順次起動しています。 # この場合、アセンブルはコンパイラの中で行われています。 で、 ucbcc: 警告: ld が起動される場合は、オプション .. は ld に渡されます。... というのは、最初に起動された ucbcc が -YP,.. というオプションを 理解できなかったため、 「わたしの知らないオプションだけど、今から起動する ld ならこの オプションを理解できるかもしれないので、ld に -YP を渡します」 と言っているわけです。ただし、cc に -c オプションをつけたりすると リンクは行われないため、そういうときに備えて 「ld を実行しないようなオプションを指定された場合は ld が 実行されないので、結果的に -YP オプションは無視されます」 とも言ってます。 で、 > ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。 についてですが、-YP オプションは ld に渡されます。実行結果を 見るとなぜか /usr/ccs/bin/ld に -YP が 2つ渡されてしまって います。-YP オプションは、ライブラリを検索するディレクトリを 指定するものなので、ld は 「ライブラリを検索するディレクトリが 2つ指定されているので、 後の方を無視して、最初の方を使います」 と警告しています。 なぜ -YP オプションが複数渡されるのかを知りたいため、-v オプションを つけてもらったり、env で環境変数を見せてもらったりしましたが、怪しげ なものを見つけることはできませんでした。 > 特にldというものがいまいち理解できないのですが ld はリンカです。例えば >>3868 jeiu で printf や scanf などの関数を使っていますが、これらの関数は OS の機能として用意されているものではありませんし、コンパイラが 内蔵している機能でもありません。 /usr/lib/ の下に *.a や *.so などのファイルがあると思いますが、 ここにコンパイル済の printf や scanf が入っており、それと結合 しているわけです。それらのライブラリ関数と、あなたが作った プログラムを結合するのがリンカの仕事で、コンパイル済の printf や scanf はどのディレクトリに置いてあるかを指定するのが -YP オプションです。 だらだらと書いてきましたが、ぶっちゃけて言うと一般的な解決方法は Solaris では /usr/ucb/cc を使わず、/opt/SUNWspro/bin/cc を 使う。できれば PATH から /usr/ucb/cc を削除した方がよい というもので、これはよく知られたノウハウです。/usr/ucb は SunOS4 時代 (20年くらい前) との互換性のためのディレクトリで あって、今どき積極的に使う必要性はありません。 ただ、わたしは根本的な原因を知りたかったので しつこく聞いて みたのですが、実を結ばなかったようで誠に残念です。 以下は余談ですが、あなたの環境のコンパイラはおそらく Forte C update 2 という Sun の製品です。わたしの手元には Solaris2.6 + Sun Workshop (Forte C の前バージョン。Sun の製品) がありますが、いくら頑張っても 同じエラーメッセージを出すことができませんでした。 よって、多分 Forte C の不具合ではないかと予想しています。 |
>>3811 68user >>3810 どら 富士通のコンパイラも入っていそうだという事が気になるのですが・・・ /usr/ccs/bin/ucbcc は Forte へのシンボリックリンクになってますか? |
>>3812 zsh > 富士通のコンパイラも入っていそうだという事が気になるのですが・・・ /opt/FSUNf90/bin とかですか? Fortran のコンパイラと見たので 特に関係はないかと判断したのですが、どうなんでしょうね。 |
>>3811 68user お手数をおかけしてすいませんでした。 説明がわかりやすくてうれしかったです!! PATHから/usr/ucb/ccを削除してみました。 そしたらいままでの警告文はなくなりました!!ありがとうございました。 しかし今までになかった警告文がでました。 ------------------------------------------------------------------- "ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります ------------------------------------------------------------------- というものでした。今まではこんな警告もなかったし、3行目の空白も見当たりません。 この前載せたプログラムと同じものなのですが、#includeと<stdio.h>の間の空白を消してみましたが同じでした。 またなにか問題なのでしょうか?他の例題に関してもまったくおんなじ警告文がでます… この形の警告文はたいていプログラムの問題だったので、プログラムをいじれば解決していたのですが… あと、もしよろしければ、gnuplotの使い方も教えていただければうれしいのですが… いろいろなホームページ上の例題をやってみたのですが、どれもうまくいかなくて… (特に、Cのプログラムをgnuplotに出力させたいのですが、gnuplot本体を置くディレクトリの場所とか、リンクの仕方とか…) もし時間があればでけっこうですので、少し教えていただけないでしょうか。よろしくお願いします。 |
>>3814 どら > "ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります ソースを少しずつ削って、この警告が出る場所を特定してください。 問題の行を特定したけれども原因がわからない場合は、 % od -cx < ex3-1.c (最小限まで削ったファイル) として、変な文字が入っていないか確認してください。 > もしよろしければ、gnuplotの使い方も教えていただければうれしいのですが… 質問がある場合は http://www.hyuki.com/writing/techask.html を熟読した上でお願いします。ただしこの掲示板ではこれまで gnuplot の話題が 出たことはないので、 Gnuplot Q&A 掲示板 http://ayapin.film.s.dendai.ac.jp/cgi-bin/trees.cgi などで聞いた方がよいかもしれません。適切な答えをもらうにはどこで 質問するのが効果的かを見極めた上でどうぞ。 それはそれとして > Cのプログラムをgnuplotに出力させたいのですが やればできるでしょうけど、gnuplot の使い方としては適切ではないような気がします。 |
>>3815 68user >> "ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります >ソースを少しずつ削って、この警告が出る場所を特定してください。 includeの文を1行全部削ってみた所、正常に動きました。 しかし、includeの文はプログラムには絶対必要なものと思っていたのですが… include文が無くても動くということはありえるのですか? 下に正常に動いたプログラムを書きます。 ----------------------------------------------------------------------- /* 【例題3.1】 rei3_1 */ main() { int a,b; printf("異なる2つの整数を入力してください--->"); scanf("%d %d",&a,&b); if(a > b) printf("%d --- BIG\n",a); } ------------------------------------------------------------------------ |
>>3816 どら > includeの文を1行全部削ってみた所、正常に動きました。 逆です。動くように削っていくのではなく、動かない最小限の部分を 突き止め、その原因を探る方法を教えたつもりです。 つまり #include に原因があることがはっきりしたので、 % grep include ex3-1.c | od -cx として、なぜ警告が出るのかを調べるべきです。 > include文が無くても動くということはありえるのですか? いろいろありますが、初心者のうちは include 文は書くべきと 思っておく方がよいでしょう。 |
>>3817 68user この前のプログラムから、#includeと<stdio.h>の間の空白を削除してみましたが、やはり同じ警告が出ました。 それで、そのプログラムにgrepをかけてみました。どこに空白文字があるのかがわかりません… あるとしても最後の“\d\n”ぐらいだと思うのですが、これは指令とは関係ないし、必要なもののはずなのですが… 下に“grep include ex3-1.c | od -cx”の結果を書きますので、終えてください。よろしくお願いします。 -------------------------------------------------------------------------- 0000000 # i n c l u d e < s t d i o . h 2369 6e63 6c75 6465 3c73 7464 696f 2e68 0000020 > \r \n 3e0d 0a00 0000023 ------------------------------------------------------------------------- |
>>3818 どら > 0000020 > \r \n 改行コードが CR LF になっています。UNIX の改行コードは LF です。 CR が空白文字扱いされているのでしょう。 とりあえず CR を削るだけなら tr コマンドが使えます。 http://x68000.startshop.co.jp/~68user/unix/pickup?tr Windows で作ったソースを ftp などで UNIX 上に持ってきて いるなら、アスキーモードで転送しましょう。ただし、全て UNIX 上で開発するのがスキルアップへの道だと思います。 |
>>3819 68user trコマンドで\r\nを\nに変えてみるとうまく作動しました。 ためしに、ftpでの転送もアスキーモードに変えると うまく作動しました。 原因が改行コードとは…気づきませんでした。 いろいろとありがとうございました。 |
初めて掲載しますが....、 ソケット通信で、select()を使用した非同期通信をさせているのですが、 select()で検知した当該FDを(例としてFD=10と設定)recv()したら、 FD=10のrecv()返値が0(CLOSE?)となることがあります。 recv()返値が0の場合は、相手側がCLOSEしたものと認識はできるのですが、 疑問に思う動作でそれは、通常FD=10ならFD=10を介して送受信を行い、 select()監視しさせて、何かイヘ゛ント発生があればrecv()の動作に遷移する 動きを正常にしているのですが、突然的に(不規則と言うか、不確定と言うか) FD=10で送信後そのFD=10で受信するのに、select()からの戻りが数十秒 (ほとんど決まって、24〜25秒経って)経って検知され、recv()したら 返値が0であると言う動作があります。 このような動作になる原因が解らず、何かヒントや調べる手立てとかありませんか???。 (これって、ネットワーク障害/ネットワーク負荷とか、相手側マシンのHW的障害 などの影響も考えられますか....???) ...記述表現が的確でありませんが、ご了承ください。 |
いまここのHTTPクライアントを参考にして POSTをCGIへ仲介するCGIを作っているのですがうまくいきません; GETのところを print SOCKET "POST / HTTP/1.0\r\n"; print SOCKET "Content-Length: $size\r\n"; print SOCKET "\r\n"; print SOCKET "$buffer\r\n"; として $buffer = $ENV{ 'QUERY_STRING' }; $size = length $buffer; を追加してみたのですが・・・。お知恵を拝借できませんでしょうか? |
>>3821 マツマツ > FD=10で送信後そのFD=10で受信するのに、select()からの戻りが数十秒 > (ほとんど決まって、24〜25秒経って)経って検知され、recv()したら > 返値が0であると言う動作があります。 よく理解できませんが、 1. send し、select で待つ。 2. 相手側はデータを受信後、すぐに close しているはず。 3. ところが select で 24〜25 秒待たされ、その後に読み込み可能になる。 4. recv すると 0 が返ってくる。 ということであれば、 a. ネットワークの質が悪く、TCP の再送タイマが働いている b. 2 で相手が 24〜25 秒かけて何かを処理してから close している くらいしか思いつきませんでした。パケットダンプしてみては。 >>3822 ユウキ そんな複雑なプログラムを書くのはやめて、まずは単純に POST する プログラムを書くべきでしょう。もし、そういうプログラムは既に作成済 ということであれば、うまくいく場合とうまくいかない場合のリクエストを 見比べればわかるでしょう。 あと、質問をする前に http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse を読んでください>質問者の方々 自分の使っている環境すら書かない人、回答してもわかったのかどうか返事さえ 書かない人が多くて、少々うんざりです。 |
申し訳ないです;少し安易に書き込んでしまいました。。。 単純にPOSTしてみます。深夜なのに申しわけなかったッス |
●コメント/アドバイスの程ありがとうございます。 (個人的に多忙な面もあり、有意な内容が書かれていることに対して、 返事が遅れた点は、お許しください) 後追いの記載ですいませんが、使用しているマシンはSUNのSC2000 (OS:Solaris2.4)と、SVR4ベースOSを使ったマシン(ここでは相手側) です。(LANのスペックは10BASE) <=両者とも今ではかなり古いものですが...。 またあえて言わしていただきますと、下記の3,4が発生するのは SVR4ベースOSを使ったマシン側です。 > FD=10で送信後そのFD=10で受信するのに、select()からの戻りが数十秒 > (ほとんど決まって、24〜25秒経って)経って検知され、recv()したら > 返値が0であると言う動作があります。 よく理解できませんが、 1. send し、select で待つ。 2. 相手側はデータを受信後、すぐに close しているはず。 3. ところが select で 24〜25 秒待たされ、その後に読み込み可能になる。 4. recv すると 0 が返ってくる。 ということであれば、 a. ネットワークの質が悪く、TCP の再送タイマが働いている b. 2 で相手が 24〜25 秒かけて何かを処理してから close している くらいしか思いつきませんでした。パケットダンプしてみては。 ●まずは、LANアナライザーを噛まして見たいと思います。 ちなみにTCPの再送タイマってものが働いている場合、そのタイマは 24〜25秒の値なのでしょうか。 >>3822 ユウキ そんな複雑なプログラムを書くのはやめて、まずは単純に POST する プログラムを書くべきでしょう。もし、そういうプログラムは既に作成済 ということであれば、うまくいく場合とうまくいかない場合のリクエストを 見比べればわかるでしょう。 ●そうですね。(基本的なことから行うべきですね) |
>>3825 マツマツ > ちなみにTCPの再送タイマってものが働いている場合、そのタイマは > 24〜25秒の値なのでしょうか。 「詳解 TCP/IP Vol.1」によれば、RTT (往復時間) がほぼ 0 な LAN 上では、 再送間隔は 1秒・3秒・6秒・12秒・24秒… で、これを最初の送信からの経過時間で表すと 1秒・4秒・10秒・22秒・46秒… だそうです。 ただし RTT にそれなりの時間がかかる場合は、上記の通りには なりません (計算式が難しくてよくわかりませんが)。 なお、上記の事柄が Solaris 2.4 や、同時代の SVR4 にも当て はまるかどうかはわかりません。 |
> ちなみにTCPの再送タイマってものが働いている場合、そのタイマは > 24〜25秒の値なのでしょうか。 「詳解 TCP/IP Vol.1」によれば、RTT (往復時間) がほぼ 0 な LAN 上では、 再送間隔は 1秒・3秒・6秒・12秒・24秒… で、これを最初の送信からの経過時間で表すと 1秒・4秒・10秒・22秒・46秒… だそうです。 ●ありがとうございます。 (TCP/IPプロトコルについて、技術的な専門知識が分っていないため、 今後は勉強したいと思います。) で、少々また不仕付けなお話ですみませんが、再送タイマが発生していると した場合に、その原因/要因には、何があるでしょうか。 ”ネットワークの質が悪く、TCP の再送タイマが働いている” の部分で気になり、どちらかのマシンのHW不調(LAN・I/Fカードや CPUボード等)とか、LANケーブル、HUB、トランシーバなどの 不調の影響で発生することとか考えられるでしょうか?。 (パケットトレースで確認することは必要なのですが、発生していると 分った時の発生原因を特定する上で、まず想定できる可能性のものがあれば と思った次第からです) (HW回りを疑って見るべきかどうか、何とも言えないのですが...) ただし RTT にそれなりの時間がかかる場合は、上記の通りには なりません (計算式が難しくてよくわかりませんが)。 なお、上記の事柄が Solaris 2.4 や、同時代の SVR4 にも当て はまるかどうかはわかりません。 |
>>3827 マツマツ パケットを送信した後、一定時間が経過しても ACK が返ってこなければ 再送するわけなので、 > どちらかのマシンのHW不調(LAN・I/FカードやCPUボード等)とか、 > LANケーブル、HUB、トランシーバなどの不調の影響で発生することとか > 考えられるでしょうか?。 これらすべてがパケット再送の原因となりえます。 |
この土日で当ページの引越しを予定しています。しばらく繋がらなかったり するかもしれませんが、あらかじめご了承ください。 |
というわけで引っ越しました。 現時点でわかっている問題点は、 - 掲示板の全文検索が動かない (準備中) - SEGA BBS 過去ログの全文検索が動かない (準備中) です。この他に変なところがあればご指摘いただけると幸いです。 |
>>3830 68user > - 掲示板の全文検索が動かない (準備中) 一応検索できるようになりました。 |
日記。 FreeBSD 5.2.1-RELEASE の /usr/bin/sort は NetBSD の sort から GNU の textutils の sort に変わってしまったらしい。sort -c で件数を数えることができなくなってしまった。ショック。 |
>>3832 68user > sort -c で件数を数えることができなくなってしまった。 間抜けな勘違いをしていました。uniq -c と混同してただけでした。 sort も uniq もこれまで通り普通に使えますね。 |
最近になってTCP/IPの勉強を始めましたが、 データリンク層 トランスポート層 ネットワーク層 の役割に反する実装の実例を挙げろって言われても…… 何の事だかさっぱりです。 誰かわかるひといませんか? |
>>3834 マオ猫 > …の役割 は何なのかをまず考えてみるべきでしょう。 ところで素朴な疑問ですが、これってどんな本 or 人 or 試験 からの出題ですか? |
いつも参考にさせてもらってます。 この度、仕事でSSL/TSLに対応したバッチ用のFTPクライアントが必要になったのですが、 Perlで実現できますでしょうか? いろいろ検索してみたのですが、これといったのが見つからなくて・・・ もし何か知っていましたら、ご教授お願いします。 |
ちなみに使用するサーバはRedHat Linux9.0です。 |
>>3836 う > この度、仕事でSSL/TSLに対応したバッチ用のFTPクライアントが必要になったのですが、 > Perlで実現できますでしょうか? Perl で「簡単に」行うモジュールはまだないと思います。Perl にこだわるなら http://perldoc.jp/docs/modules/IO-Socket-SSL-0.91/SSL.pod などを使ってがんばるしかないでしょう。 あるいは http://www.perldiscuss.com/thread.php?group=perl.libnet の 「Net::FTP versus TLS」のスレッドの人たちに「サンプルくれ!」とお願いする 手もあるかも (もらえたらわたしにもください)。 上記のスレッドでも出ていますが、手抜きするなら lftp (http://lftp.yar.ru/) が SSL/TLS に対応しているようなので、これを system なりで呼び出すのが楽だと思われます。 |
FreeBSD 5.2.1-RELEASE に TLS な proftpd をインストールし、lftpd で 接続してみるメモ。OpenSSL は標準でインスールされているが、なぜか proftpd を make -DWITH_OPENSSL install すると ports の OpenSSL が要求 されるので、まずそれを入れる。 # cd /usr/ports/security/openssl && make install # cp /usr/local/openssl/openssl.cnf.sample /usr/local/openssl/openssl.cnf # mkdir /usr/local/openssl/proftpd 鍵作成 (パスフレーズなし)。CSR を作成し、自己認証。 # cd /usr/local/openssl/proftpd # openssl genrsa > key.pem # openssl req -new -days 365 -key key.pem -out csr.pem # openssl x509 -in csr.pem -out cert.pem -req -signkey key.pem -days 365 ProFTPD のインストール。 # cd /usr/ports/ftp/proftpd # make -DWITH_OPENSSL install # mkdir /var/run/proftpd # cat <<END >> /usr/local/etc/proftpd.conf <IfModule mod_tls.c> TLSEngine on TLSLog /var/log/proftpd-tls.log TLSProtocol TLSv1 TLSRequired off TLSRSACertificateFile /usr/local/openssl/proftpd/cert.pem TLSRSACertificateKeyFile /usr/local/openssl/proftpd/key.pem TLSVerifyClient off </IfModule> ProFTPD 起動。rc まわりが rcNG になったので、proftpd_enable が必要 (?) # echo 'proftpd_enable="YES"' >> /etc/rc.conf # /usr/local/etc/rc.d/proftpd.sh start lftpd で接続テスト。 # cd /usr/ports/ftp/lftpd && make install % lftp -d hoge@localhost Password: *** lftp hoge@localhost:~> ls ---- Connecting to localhost () port 21 <--- 220 ProFTPD 1.2.10rc1 Server (ProFTPD Default Installation) [hostname] ---> AUTH TLS <--- 234 AUTH TLS successful Certificate depth: 0; subject: /C=JP/ST=XX/O=Internet Widgits Pty Ltd; issuer: /C=JP/ST=XX/O=Internet Widgits Pty Ltd WARNING: Certificate verification: self signed certificate ---> USER hoge <--- 331 Password required for hoge. ---> PASS XXXX <--- 230 User hoge logged in. ---> PWD <--- 257 "/usr/home/hoge" is current directory. ---> PBSZ 0 <--- 200 PBSZ 0 successful ---> PRET LIST <--- 500 PRET not understood ---> PASV <--- 227 Entering Passive Mode (127,0,0,1,192,51). ---- Connecting data socket to () port 49203 ---> LIST <--- 150 Opening ASCII mode data connection for file list ---- Closing data socket <--- 226 Transfer complete. (略) lftp hoge@localhost:~> |
どうでもいいんですが、ここ数年モチベーションが低下して、web の 更新が非常に少なくなっていました。 そこで数日前からトップページなどにバナー広告を付けてみました。 バナー広告を貼る → 収入がっぽり → 更新する気力がわく ということを夢見ていましたが、3日での収入はなんとびっくり 15円でした。 つまり 1日 5円。月に150円。年に 1800円。 5,000円以上にならないとお金が振り込まれないので、あと 2年半くらい 経ったらわたしは 5,000円手にすることになります。いやーここまで 儲からないものとは。 しかしわたしは変なところで前向きなので、今の 100倍の人が見にきて くれれば毎日 500円、月に 15,000円も儲かるかと思うと、モチベーション あがりっぱなしです。というわけで、訪問者を 100倍にする第一歩として、 web と CGI のひみつ (http://X68000.q-e-d.net/~68user/webcgi/) の 全文検索 (http://X68000.q-e-d.net/~68user/webcgi/search-1.html) を全面的にリライトしました。 |
サイト更新ありがとうございます。参考にしてます。 全文検索できないのですが。(実行に必要な権限がない。とのこと) テスト中でしたらすみません。 |
>>3841 naisttn > 全文検索できないのですが。(実行に必要な権限がない。とのこと) 掲示板の全文検索ですね? namazu.cgi の存在をすっかり忘れてしまい、cgi-bin/wwwboard/ 以下を 閲覧不可に設定してしまいました。本日中に直します。 |
>>3841 naisttn 直しました。ご指摘ありがとうございました。 結局 .htaccess を # namazu.cgi 以外はアクセス拒否 SetEnvIf Request_URI "namazu.cgi" IS_NAMAZU order deny,allow allow from env=IS_NAMAZU deny from all としたのですが、他にわかりやすい書き方ないですかねぇ? <Files !~ "namazu.cgi"> deny from all </Files> とか <Files "namazu.cgi"> <Else> deny from all </Else> </Files> とか <FilesMatch "(?:(?!namazu.cgi).)*"> deny from all </FilesMatch> とか書けないもんでしょうか。 てゆーか、apache の書式は絶対に腐ってると思う。 |
UNIX の部屋 http://x68000.q-e-d.net/~68user/unix/ を更新しましたが、たいしたことは書いていません。 |
OpenSSLを使ってC言語でHttpClientを実装する方法を参考にさせて頂きました。 ですがサンプル通りでは、SSL_connect()で-1が返ってきます。 ずっと調べてまして、乱数を作成する時の種を設定しないと行けないみたいです。 それもある程度の長さの種じゃないと駄目なようです。(私の環境では32以上) 今、自宅なのでOpenSSLのバージョンはどれなのか判りませんが、 SSL_connect()するまでに以下の関数のどれかを使うと良い様です。 1、RAND_load_file() 2、RAND_seed() 3、RAND_poll() 一番楽なのは3を使うのが楽ですし、一般的で確実かもしれません。 ちなみにマスタリングTCP/IP SSL/TSL編のサンプルでは1が使われてました。 できれば、「SSL/TLS でアクセスしてみよう」に追記して頂ければ、 今後同じ所で嵌る人が困らないと思います。 お忙しいと思いますが、宜しくご検討下さい。 |
>>3845 ニッタン 質問ですが、 http://search.luky.org/obu/msg02180.html http://search.luky.org/obu/msg02181.html と同じく、/dev/random が存在しない環境でしたか? |
UNIX の部屋 http://x68000.q-e-d.net/~68user/unix/ を更新しましたが、苦労したわりに内容はいまいちです (m4 とか)。 あと、見栄えをいじりましたが、もし見づらかったら文句言ってください。 |
ネームサーバはプライマリとセカンダリを置いて、プライマリが障害の場合セカンダリが応答しますよね。 この仕組みはどのように実現されているのでしょうか? 仮にプライマリがダウンした直後に、プライマリに問い合わせたクライアントがあったとすると、 応答待ちでしばらくするとエラーになりますよね?(自身なし) しかし、しばらくすると、すべてのクライアントが障害のないセカンダリにのみ問い合わせるようになりますよね?(自身なし) この間はどのくらいの時間なのでしょうか? どこかで調整できるのでしょうか? |
68userさん、お返事ありがとうございます。 実は、今日会社を休んだ為、OpenSSLのバージョンはまだ判っていませんが、 /dev/randomの件は、マスタリングTCP/IP SSL/TSL編には 少し紹介されてました。 結論から言いますと、多分/dev/randomは存在しない環境かと。 サンプルのソースだとOpenSSLのライブラリー部分で、 /dev/randomに標準でアクセスしに行く様になっているでしたら 現状のサンプルのままでも問題ないかと思います。 (でも一文位あったら親切だな〜っと思ったりもします。お忙しいと思いますが) プロキシー接続だったので、過去ログではプロキシーでしか検索していませんでした。 結局、プロキシー云々は関係なかったですが。 |
>>3848 bindユーザ > プライマリが障害の場合セカンダリが応答しますよね。 これは誤りで、セカンダリは常にリクエスト・レスポンスの送受信を しています。 > 仮にプライマリがダウンした直後に、プライマリに > 問い合わせたクライアントがあったとすると、 タイムアウトすると即座にセカンダリにリクエストを投げると思います。 > すべてのクライアントが障害のないセカンダリにのみ > 問い合わせるようになりますよね? ならないです。プライマリにもアクセスし続けます。 以上はキャッシュサーバについての説明です。 通常のマシンはキャッシュサーバにアクセスするだけで、コンテンツ サーバ (プライマリ DNS サーバやセカンダリ DNS サーバ) に直接 アクセスすることはない、ということに注意してください。 とか言いつつ、わたしは DNS サーバの運営をしたことがないので、 嘘をついているかもしれません。 http://dns.qmail.jp/server/ をご一読ください。 >>3849 ニッタン ソースが不十分であることは認識していますので、直します。 # ついでにエラーメッセージの出力が不十分なので、これも # 直します。 ただ、なぜ RAND_load_file()/RAND_seed()/RAND_poll() しなければ ならないのかを正確に書きたかったので、質問させていただきました。 今気づきましたが、FAQ にも書いてありますね。 http://www.openssl.org/support/faq.html#USER1 1週間ほど時間をください。 |
>>3847 68user チェックボタンをonにする、ラベル用途のJavaScriptでエラーが出ます。 数年前からだと思うのですが… 私は、Windows2K & ie6ユーザーです。 |
>>3851 hash ありがとうございます。丸一年気づいていませんでした。 さきほど修正しました。 どうでもいいんですが、こういう用途に使える label 要素 ってのがあることをつい先日知りました。 http://tohoho.wakusei.ne.jp/html/label.htm |
この掲示板の全文検索 (namazu.cgi) ですが、問題が発生したため 再び休止します。 |
お聞きしたいのですが、 Linuxでのbashシェルを使った 環境変数PATHの順番を変更するやり方を教えてください。 |
>>3854 tototo お望みの PATH をそのまま設定する方が自然だと思われます。 どうしても「順番の変更」でなくてはならない理由はありますか? |
68userさん、 お忙しいとは思いますが、よろしくお願い致します。 とっても有益な情報が沢山載っているので、 今後も役立つと思いますので、頑張ってください。 私の方でももう一度、調べてみましたが RAND_poll()が、自動的に呼ばれる様になっていますね。 (FAQにもそれらしい事が書いてあるような気もしますね。) 私の使っている環境に移植してきた担当者が RAND_poll()を空関数に実装し直していました。 出来れば、ERR_print_errors_fp()の存在も追記して頂けると重宝すると思います。 |
はじめまして。大学生をやっていますつばきです。 Unixのコマンドの意味でわからないことがありました。 学校の課題で「ftp」と「rcp」の違いを説明せよ、というものがありまして、 こちらのサイトでコマンドを検索してみたのですが、 「ftp」はファイルを置いてくる/持ってくる、「rcp」はファイルをコピーする、という説明が出てきました。 この二つ、特に持ってくるとコピーするの部分は同じ意味のような気がするのですが 具体的な違いは何なのでしょうか。 できれば、でよろしいのでご回答お願いします。 |
>>3856 ニッタン > 出来れば、ERR_print_errors_fp()の存在も追記して頂けると重宝すると思います。 了解です。 >>3857 つばき > この二つ、特に持ってくるとコピーするの部分は同じ意味のような気がするのですが 同じです。 - ftp なら get するか、put するか - rcp なら rcp ./file host: するか rcp host:file . するか の違いです。 わたしの思う大きな違いは Anounymous ftp という仕組みでファイルを 配布できるのが ftp、そうでないのが rcp。 後は些細な違いしかないと思いますが、それでも 10 や 20 はあげられる かと思います。課題ということなのでいろいろ調べてみてください。 |
はじめまして、ネットワークプログラミングの勉強をしています。 Windows上でネットワーク関連のソフトウェアを作成したことはあるのですが、 ライブラリを使用していた為、SocketAPI等はあまり深い知識がありません。 そこで教えていただきたい事があるのですが、ここの掲示板でよろしいでしょうか? 1.WindowsのSocketとUNIXのSocketで関数の違い等あるのでしょうか? 2.UNIXのSocketでも、Linux、FreeBSD、Solaris等で違いがあるのでしょうか? 参考情報等教えていただきたいと思ってます。宜しくお願い致します。 |
順番変更しなければならない理由はないのですが、 PATHの順番を変更するやり方 はあるのかが気になったのため、お聞きしました。 |
>>3859 samsara > 1.WindowsのSocketとUNIXのSocketで関数の違い等あるのでしょうか? http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/bsd-compatibility.html など。 > 2.UNIXのSocketでも、Linux、FreeBSD、Solaris等で違いがあるのでしょうか? たとえば http://x68000.q-e-d.net/~68user/net/echo-3.html#6 の backlog とか、UDP で受信できる最大サイズを超えた場合の 処理などですかね。より詳しいことを知りたいなら http://x68000.q-e-d.net/~68user/net/link-book.html 「UNIX ネットワークプログラミング第2版 Vol.1」 をどうぞ。後は http://apr.apache.org/ などのライブラリのソースの #if 部分をとことん読む、などなど。 >>3860 tototo > PATHの順番を変更するやり方 PATH=`echo $PATH | sed 's@/usr/bin:@@'`':/usr/bin' とか for i in `echo $PATH | tr ':' ' '`; do いろいろ done とかですかねぇ。 |
ここ数ヶ月 (web 引越し前)、マルチポストしたり回答しても返事すら 書かない質問者が多く、困っていました。困るだけならまぁいいんですが、 わたしの web 更新のモチベーションを大いに下げてくれました。 というわけで、↑に書いたとおり、 http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?howtouse を読まない・読んでも守りたくない人は質問しないでください。 もちろん、これらのルールを守っておられる方々の質問は引き続き 歓迎いたします。 これはマナーではなく、この掲示板のルールであることに注意して 下さい。これが気にいらない方は (当然ながら) この掲示板を見ない 自由があります。 web 引越し後は以前のような不届きな質問者はいなくなったようで、 とてもうれしく思っています。 |
68userさま、回答ありがとうございます。 教えていただいたページをじっくり読んでみます。 |
>>3845 ニッタン 自分用のメモ。ソースが SSL_CTX *ctx = SSL_CTX_new(SSLv23_client_method()); SSL ssl = SSL_new(ctx); SSL_connect(ssl); となっていたとして、 SSL_CTX *SSL_CTX_new(SSL_METHOD *meth){ ret->method=meth; SSL_METHOD *SSLv23_client_method(void){ SSLv23_client_data.ssl_connect=ssl23_connect; int ssl23_connect(SSL *s) ret=ssl23_client_hello(s); static int ssl23_client_hello(SSL *s) RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE); int RAND_pseudo_bytes(unsigned char *buf, int num) const RAND_METHOD *meth = RAND_get_rand_method(); return meth->pseudorand(buf,num); /* (*1) */ const RAND_METHOD *RAND_get_rand_method(void) default_RAND_meth = RAND_SSLeay(); /* (*2) */ return default_RAND_meth; static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num){ ret = RAND_bytes(buf, num); static int ssleay_rand_bytes(unsigned char *buf, int num) if (ok){ ... } else { RANDerr(RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDED); ときて「PRNG not seeded」エラーになる、てな感じですかね。 (*1) RAND_METHOD rand_ssleay_meth={ ssleay_rand_seed, ssleay_rand_bytes, ssleay_rand_cleanup, ssleay_rand_add, ssleay_rand_pseudo_bytes, ssleay_rand_status }; typedef struct rand_meth_st { void (*seed)(const void *buf, int num); int (*bytes)(unsigned char *buf, int num); void (*cleanup)(void); void (*add)(const void *buf, int num, double entropy); int (*pseudorand)(unsigned char *buf, int num); int (*status)(void); } RAND_METHOD; (*2) RAND_METHOD *RAND_SSLeay(void) return(&rand_ssleay_meth); |
68user様。回答ありがとうございました。 自分なりに調べまして解決しました。助言を下さってありがとうございます。 |
To UNIXの部屋管理者様 もしかすると変なことを行ってるかもしれませんが。 cp -r の項目で以下の解説が有りますが。 -R ディレクトリを再帰的にコピーする ディレクトリ dir1 以下に、ファイル foo・bar があった場合、 % cp -R dir1 dir2 は、ディレクトリ dir2 の下にディレクトリ dir 1をコピーする。つまり dir2/dir1/foo、dir2/dir1/foo <<<<<<<<<の二項目はdir2/dir1/barではないでしょうか というファイルが新たに作成される。一方、 % cp -R dir1/ dir2 とすると(`/'を付けると)、dir2 の下に dir1 以下のファイル・ディレクトリをコピーする。つまり dir2/foo、dir2/foo <<<<<<<<<同様にの二項目はdir2/barではないでしょうか というファイルができる。 |
68userさん、はいそうです。 ここまで調べるのは苦労しませんでしたか? 私はマスタリングTCP/IP SSL/TLS編がなければ 未だに判らなかったと思います。 |
ただいまSLL勉強中です。このHPも参考にさせて頂いています。 つまらない質問ですが初心者の至りということでお許しください。 ネットワークプログラミングの基礎知識 >> RSA で暗号化してみよう (1)に 暗号化のサンプルがありますが、これらの作業はOpenSSLのライブラリの中で 行われている事なのでしょうか。 たとえば、ネットワークプログラミングの基礎知識 >> SSL/TLS でアクセスしてみよう (1) には暗号化の記述はありませんが実際には指定したプロトコルで暗号化が行われている と思います。どこで実装されるものなのでしょうか? |
>>3866 鶏 ご指摘のとおりかと思います。というわけで、修正しました。 http://X68000.q-e-d.net/~68user/unix/pickup?cp ありがとうございました。 >>3867 ニッタン > ここまで調べるのは苦労しませんでしたか? 調べるのに 3日かかってますので、苦労しました。 でも、なぜ RAND_poll() したらエラーにならないのかいまいち わかっていません (別にこれがわからなくても構わないんですが、 気になるもので)。 >>3868 jeiu > どこで実装されるものなのでしょうか? OpenSSL のライブラリの中です。 SSL/TLS はクライアントが利用可能な暗号 (正しくは暗号スイート) を 提示し、サーバがその中から選びます。よって常に RSA が使用される わけではありません (DH を使う場合もある)。 で、暗号スイートを提示したり、RSA で暗号化・復号化したり、 DH で鍵交換したり、プレマスターシークレットを送ったり、 ということはすべて OpenSSL のライブラリ中で記述されています。 |
>調べるのに 3日かかってますので、苦労しました。 でしたら、やはりお持ちのマスタリングTCP/IP SSL/TLS編を 辞書的に使いながら追いかける方がいいかもしれませんよ。 >でも、なぜ RAND_poll() したらエラーにならないのかいまいち わかっていません 結局、RAND_poll()内で乱数の種をプロセスIDや/dev/randomなどを使って作成して RAND_add()しているからだと思います。 RAND_seed()も結局、RAND_add()をしていますし。 |
>>3870 ニッタン /dev/random や /dev/urandom がない環境ではエラーになるが、 RAND_poll() を呼ぶとうまくいくと。 ということはおそらく RAND_poll() を呼ぶと http://snapshots.jp.freebsd.org/tour/current/userland/S/7348.html#145 に処理が移ると思います。 # このソースは OpenSSL 0.9.7d です。 ここでは /dev/random や /dev/urandom を読んでいろいろやって ますが、/dev/random や /dev/urandom がない環境なので、結局は unsigned long l; l=curr_pid; RAND_add(&l,sizeof(l),0); l=getuid(); RAND_add(&l,sizeof(l),0); l=time(NULL); RAND_add(&l,sizeof(l),0); だけが実行されると思います。ここで 第三引数の entropy には全て 0 を 渡しています。 RAND_add を呼ぶと ssleay_rand_add が呼ばれ、 http://snapshots.jp.freebsd.org/tour/current/userland/S/7341.html#190 が実行されます。 if (ok) return(1); else RANDerr(RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDED); とあるのがエラーになっている箇所かと思います。つまり RAND_poll() を 呼ぶと ok が真になり、RAND_poll() を呼ばないと偽になる、と。ここで ok とは何かというと ok = (entropy >= ENTROPY_NEEDED); です。ENTROPY_NEEDED は ./crypto/rand/rand_lcl.h:#define ENTROPY_NEEDED 32 /* require 256 bits = 32 bytes of randomness */ なので、entropy <= 32 なときに RPNG_NOT_SEEDED でエラーになる。 逆に言えば、RAND_poll() を呼ぶと entropy >= 32 になるためうまく いくようになる、ということです。しかし entropy を増やしているのは entropy += add; しかないような気がします。でも、add は RAND_add() の第三引数で、 今回はすべて 0 が渡されています。よって、 entropy += 0; となるわけです。それなのになぜ entropy が増えて >=32 になるのか わからないなぁ、といったところで止まっています。 「マスタリングTCP/IP SSL/TLS編」は調べましたが、内部構造には 触れていようで見つけられませんでした。もしどこかに載っていたら 教えてください。 |
>>3872 68user 続きです。 こちらには /dev/random・/dev/urandom が存在しない環境がないため、 FreeBSD で OpenSSL のソースをいじって、無理矢理 /dev/random・ /dev/urandom が存在しない状況を作ってみました。その結果、 PRNG not seeded なエラーが発生しました。 しかし SSL_connect() の直前に RAND_poll() を挿入しても、同じく PRNG not seeded となりました。そこで確認させていただきたいのですが、 >>3845 ニッタン > SSL_connect()するまでに以下の関数のどれかを使うと良い様です。 > 3、RAND_poll() > 一番楽なのは3を使うのが楽ですし、一般的で確実かもしれません。 はそちらの環境では正常に動作しているのですよね? |
回答ありがとうございます。 もうひとつ教えてください。 >SSL/TLS はクライアントが利用可能な暗号 (正しくは暗号スイート) を >提示し、サーバがその中から選びます。よって常に RSA が使用される >わけではありません (DH を使う場合もある)。 クライアントから提示する暗号方式とはなにをもとに決められるのでしょうか? たとえば、SSL V2に対応したアプリケーションとかV3に対応した アプリケーションとかで決まることなのでしょうか? または、Open SSL等で自力でSLLを実装するような場合は、対応できる暗号方式が 特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。 |
>>3873 jeiu > クライアントから提示する暗号方式とはなにをもとに決められるのでしょうか? クライアント作成者が勝手に決めます。例えば 3DES と RC4 はいいけど DES は暗号強度が気に入らないから使わないとか、MD5 より強固な SHA-1 を 使うとか。 OpenSSL であれば SSL_CTX_set_cipher_list() を使って好きな暗号 スイートをセットすればよいでしょう。 暗号スイートは具体的には http://www21.ocn.ne.jp/~k-west/SSLandTLS/rfc2246-Ja.txt の TLS_RSA_WITH_3DES_EDE_CBC_SHA TLS_DH_anon_WITH_3DES_EDE_CBC_SHA などを指します。 上記 RFC の ClientHello がクライアントからの暗号スイートの提示、 ServerHello がサーバからの暗号スイート決定通知、です。 > または、Open SSL等で自力でSLLを実装するような場合は、対応できる暗号方式が > 特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。 これは意味がわかりませんでした。 |
誤解を招くような書き方をしてしまいました。 申し訳ありません。 まず、RAND_poll()はRAND_byte()やRAND_status()の始めての呼び出しの際に 一度だけ呼ばれていると思われます。 RAND_poll()内では/dev/random・/dev/urandomを使用して 乱数の種を作っています。 /dev/random・/dev/urandomが存在しない環境でも 上記の様にRAND_poll()は呼ばれていますが、 No.3871の通り 乱数の種は作られません。 そこで、RAND_poll()を自前で呼び出しても同じ結果になります。 つまり、RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDEDのエラーが 発生した時は RAND_poll()で乱数の種を作成するのに失敗しているので、 自前で乱数の種を作らないといけない と言った説明を追記して頂ければいいと思います。 自前で乱数の種を作るのが 1、RAND_load_file() や 2、RAND_seed() と言う訳です。 貴重な時間を割かせてしまいまして、申し訳ありませんでした。 |
>>3875 ニッタン 更新しました。長らくお待たせしてすいません。 http://X68000.q-e-d.net/~68user/net/ssl-1.html 詳しく説明しようとして、ドツボにはまった感がありますが、 いかがでしょうか。 RAND_status を呼べばその中から RAND_poll が呼ばれるのですが、 あえて RAND_poll を呼んでいるのは、マニュアルに書いてないこと はなるべく前提としないでおこう、という方針だからです。 最初のサンプルプログラムがこれではわかりづらすぎるかなぁ。 |