68user's page 掲示板

Prev< No. 3801〜3895> Next  [最新発言に戻る] [過去ログ一覧]
No. 3801 # どら 2004/06/18 (金) 00:27:52
>>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を使用してグラフも書きたいと思っているのですが、
それについても何かアドバイスをいただければありがたいと思います。よろしくお願いします。

No. 3802 # 68user 2004/06/18 (金) 01:07:24
>>3801 どら
あらそうですか。予想と外れていたのでもうひとつ追加で質問。

>>3790 どら
> ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:...
ここだけでなく、コンパイルしてからコンパイルが終わるまで全ての
部分を見せてください。Makefile を使っているにせよ、自分でタイプ
したにせよ、とにかく全部見せてください。

> これから先にGNUplotを使用してグラフも書きたいと思っているのですが、
紛らわしいですが、gnuplot は GNU とは関係ありません。

GNU というのは、フリーなソフトウェアが大好きな FSF
という団体が提唱するソフトウェアのライセンス方式の
ことを指します。gcc も GNU ライセンスで配布されています。
しかし gnuplot はそうではありません。

あと、gcc と gnuplot は関係ないです。gcc はコンパイラ。
gnuplot はグラフ描画ソフト。

No. 3803 # 2004/06/18 (金) 10:59:55
はじめまして、こんにちは。いきなりで非常に申し訳ないのですが、socketのインクルードファイルはどこでダウンロードしたらいいのでしょうか?もしくは、どのOSになら入っているのでしょうか?

No. 3804 # 68user 2004/06/18 (金) 11:12:39
>>3803
わたしの知る限りでは、UNIX 系であれば標準で入っています。

Windows 系であれば、VC++ や C++ Builder などのコンパイラに
添付されているのかな?

No. 3805 # 蒲鉾 2004/06/18 (金) 11:41:29
UNIXの<sys/socket.h>の様なファイルは
windowsでどこにあるのですか
windowsで<sys/socket.h>をインクルードしてもファイルが開けない
というようなメッセージがでてしまいます。

No. 3806 # kou 2004/06/18 (金) 19:37:06
> 秘密鍵: e, n
> 公開鍵: d, n
> 暗号化: (平文^e)%n
> 復号化: (暗号文^d)%n
>
>として、今、平文と e が不明だとします。何をどうすると、
>何がどういうふうに循環すると考えておられますか?
nを生成するのがp,qで、それらの最小公倍数がe,dだという私の認識自体が間違っていたのでしょうか^^;
一定の頻度で循環しているから、それ以内の適当な数eでべき乗しても補完関係にあるd(最小公倍数-e)で復号化できる。
平文に「1,2,3・・」といった具合に数を代入していけば循環周期が分かるのでは?と思ったのです

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3807 # 68user 2004/06/19 (土) 00:23:45
>>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 であるということ。

No. 3808 # どら 2004/06/19 (土) 00:52:56
>>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);
}
-----------------------------------------------------------------------------------

よろしくお願いします。

No. 3809 # 68user 2004/06/19 (土) 01:43:46
>>3808 どら
たびたびすみませんが、
    % sh -x /usr/ucb/cc -v -o keisan3-2 ex3-2.c
の結果 (全文) を教えてください。

あと、env の結果も教えてください。ホスト名やログイン名などを
公開するのが嫌なら、適当に削ってから提示してください。


これ以上引っ張ると怒られそうなので、一部回答しておきますが、

> ucbcc: 警告: ld が起動される場合は、... 無視されます
> ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。
これは警告なので、実行には支障がないはずです。keisan3-2 が
生成されていませんか?

> "ex3-2.c", 16 行目: 警告: ファイルの最後に改行文字がありません
これは文字通り、ファイルの最終行が改行コードが付いて
いないのでしょう。ファイルの最終行の末尾で改行してください。
ファイル末尾に改行がないとその行を読んでくれないプログラムも
あるので、改行をつける癖をつけておくことをお勧めします。

No. 3810 # どら 2004/06/19 (土) 09:48:43
>>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 が
>生成されていませんか?
はい、ファイルはできています。実行すれば結果も出力されています。ただ、毎回この警告文がでていて、どれぐらい問題なのかどうかもわからないので、できるかぎり問題を取り除くことと、その理由が知りたいので…

>ファイル末尾に改行がないとその行を読んでくれないプログラムも
>あるので、改行をつける癖をつけておくことをお勧めします。
初めてしりました。ありがとうございます。気をつけます。

あと、もしお手数でなければ、今までされた質問の意図を教えていただければありがたいと思うのですが…手間がかかるようでしたら全然かまいませんので、よろしくお願いします。
それではまたよろしくお願いします。

No. 3811 # 68user 2004/06/19 (土) 22:05:38
>>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 の不具合ではないかと予想しています。

No. 3812 # zsh 2004/06/19 (土) 23:32:29
>>3811 68user
>>3810 どら
富士通のコンパイラも入っていそうだという事が気になるのですが・・・
/usr/ccs/bin/ucbcc は Forte へのシンボリックリンクになってますか?

No. 3813 # 68user 2004/06/20 (日) 00:12:16
>>3812 zsh
> 富士通のコンパイラも入っていそうだという事が気になるのですが・・・
/opt/FSUNf90/bin とかですか? Fortran のコンパイラと見たので
特に関係はないかと判断したのですが、どうなんでしょうね。

No. 3814 # どら 2004/06/20 (日) 21:09:26
>>3811 68user
お手数をおかけしてすいませんでした。
説明がわかりやすくてうれしかったです!!

PATHから/usr/ucb/ccを削除してみました。
そしたらいままでの警告文はなくなりました!!ありがとうございました。
しかし今までになかった警告文がでました。

-------------------------------------------------------------------
"ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります
-------------------------------------------------------------------

というものでした。今まではこんな警告もなかったし、3行目の空白も見当たりません。
この前載せたプログラムと同じものなのですが、#includeと<stdio.h>の間の空白を消してみましたが同じでした。
またなにか問題なのでしょうか?他の例題に関してもまったくおんなじ警告文がでます…
この形の警告文はたいていプログラムの問題だったので、プログラムをいじれば解決していたのですが…

あと、もしよろしければ、gnuplotの使い方も教えていただければうれしいのですが…
いろいろなホームページ上の例題をやってみたのですが、どれもうまくいかなくて…
(特に、Cのプログラムをgnuplotに出力させたいのですが、gnuplot本体を置くディレクトリの場所とか、リンクの仕方とか…)
もし時間があればでけっこうですので、少し教えていただけないでしょうか。よろしくお願いします。

No. 3815 # 68user 2004/06/21 (月) 11:07:58
>>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 の使い方としては適切ではないような気がします。

No. 3816 # どら 2004/06/22 (火) 11:16:48
>>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);
    
}
------------------------------------------------------------------------

No. 3817 # 68user 2004/06/22 (火) 12:16:39
>>3816 どら
> includeの文を1行全部削ってみた所、正常に動きました。
逆です。動くように削っていくのではなく、動かない最小限の部分を
突き止め、その原因を探る方法を教えたつもりです。

つまり #include に原因があることがはっきりしたので、
    % grep include ex3-1.c | od -cx
として、なぜ警告が出るのかを調べるべきです。

> include文が無くても動くということはありえるのですか?
いろいろありますが、初心者のうちは include 文は書くべきと
思っておく方がよいでしょう。

No. 3818 # どら 2004/06/22 (火) 15:36:28
>>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
-------------------------------------------------------------------------

No. 3819 # 68user 2004/06/22 (火) 21:23:39
>>3818 どら
> 0000020 > \r \n
改行コードが CR LF になっています。UNIX の改行コードは LF です。
CR が空白文字扱いされているのでしょう。

とりあえず CR を削るだけなら tr コマンドが使えます。
    http://x68000.startshop.co.jp/~68user/unix/pickup?tr

Windows で作ったソースを ftp などで UNIX 上に持ってきて
いるなら、アスキーモードで転送しましょう。ただし、全て
UNIX 上で開発するのがスキルアップへの道だと思います。

No. 3820 # どら 2004/06/22 (火) 23:53:00
>>3819 68user

trコマンドで\r\nを\nに変えてみるとうまく作動しました。
ためしに、ftpでの転送もアスキーモードに変えると
うまく作動しました。
原因が改行コードとは…気づきませんでした。

いろいろとありがとうございました。

No. 3821 # マツマツ 2004/06/23 (水) 22:43:52
初めて掲載しますが....、
ソケット通信で、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的障害
などの影響も考えられますか....???)
...記述表現が的確でありませんが、ご了承ください。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3822 # ユウキ 2004/06/24 (木) 01:45:54
いまここの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;
を追加してみたのですが・・・。お知恵を拝借できませんでしょうか?

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3823 # 68user 2004/06/24 (木) 02:14:44
>>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
を読んでください>質問者の方々

自分の使っている環境すら書かない人、回答してもわかったのかどうか返事さえ
書かない人が多くて、少々うんざりです。

No. 3824 # ユウキ 2004/06/24 (木) 04:44:17
申し訳ないです;少し安易に書き込んでしまいました。。。
単純にPOSTしてみます。深夜なのに申しわけなかったッス

No. 3825 # マツマツ 2004/06/24 (木) 15:55:40
●コメント/アドバイスの程ありがとうございます。
(個人的に多忙な面もあり、有意な内容が書かれていることに対して、
返事が遅れた点は、お許しください)

後追いの記載ですいませんが、使用しているマシンは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 する
プログラムを書くべきでしょう。もし、そういうプログラムは既に作成済
ということであれば、うまくいく場合とうまくいかない場合のリクエストを
見比べればわかるでしょう。
●そうですね。(基本的なことから行うべきですね)

No. 3826 # 68user 2004/06/24 (木) 21:05:18
>>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 にも当て
はまるかどうかはわかりません。

No. 3827 # マツマツ 2004/06/24 (木) 22:32:53
> ちなみにTCPの再送タイマってものが働いている場合、そのタイマは
> 24〜25秒の値なのでしょうか。
「詳解 TCP/IP Vol.1」によれば、RTT (往復時間) がほぼ 0 な LAN 上では、
再送間隔は
            1秒・3秒・6秒・12秒・24秒…
で、これを最初の送信からの経過時間で表すと
            1秒・4秒・10秒・22秒・46秒…
だそうです。
●ありがとうございます。
(TCP/IPプロトコルについて、技術的な専門知識が分っていないため、
今後は勉強したいと思います。)
で、少々また不仕付けなお話ですみませんが、再送タイマが発生していると
した場合に、その原因/要因には、何があるでしょうか。
”ネットワークの質が悪く、TCP の再送タイマが働いている”
の部分で気になり、どちらかのマシンのHW不調(LANI/Fカードや
CPUボード等)とか、LANケーブル、HUB、トランシーバなどの
不調の影響で発生することとか考えられるでしょうか?。
(パケットトレースで確認することは必要なのですが、発生していると
分った時の発生原因を特定する上で、まず想定できる可能性のものがあれば
と思った次第からです)
(HW回りを疑って見るべきかどうか、何とも言えないのですが...)

ただし RTT にそれなりの時間がかかる場合は、上記の通りには
なりません (計算式が難しくてよくわかりませんが)。

なお、上記の事柄が Solaris 2.4 や、同時代の SVR4 にも当て
はまるかどうかはわかりません。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3828 # 68user 2004/06/26 (土) 00:30:41
>>3827 マツマツ
パケットを送信した後、一定時間が経過しても ACK が返ってこなければ
再送するわけなので、
> どちらかのマシンのHW不調(LAN・I/FカードやCPUボード等)とか、
> LANケーブル、HUB、トランシーバなどの不調の影響で発生することとか
> 考えられるでしょうか?。
これらすべてがパケット再送の原因となりえます。

No. 3829 # 68user 2004/06/26 (土) 00:43:43
この土日で当ページの引越しを予定しています。しばらく繋がらなかったり
するかもしれませんが、あらかじめご了承ください。

No. 3830 # 68user 2004/06/27 (日) 06:03:01
というわけで引っ越しました。

現時点でわかっている問題点は、
    - 掲示板の全文検索が動かない (準備中)
    - SEGA BBS 過去ログの全文検索が動かない (準備中)
です。この他に変なところがあればご指摘いただけると幸いです。

No. 3831 # 68user 2004/06/28 (月) 01:28:30
>>3830 68user
> - 掲示板の全文検索が動かない (準備中)
一応検索できるようになりました。

No. 3832 # 68user 2004/06/29 (火) 03:06:18
日記。

FreeBSD 5.2.1-RELEASE の /usr/bin/sort は NetBSD の sort から
GNU の textutils の sort に変わってしまったらしい。sort -c
で件数を数えることができなくなってしまった。ショック。

No. 3833 # 68user 2004/06/30 (水) 02:06:52
>>3832 68user
> sort -c で件数を数えることができなくなってしまった。
間抜けな勘違いをしていました。uniq -c と混同してただけでした。
sort も uniq もこれまで通り普通に使えますね。

No. 3834 # マオ猫 2004/06/30 (水) 23:03:44
最近になってTCP/IPの勉強を始めましたが、
    データリンク層
    トランスポート層
    ネットワーク層
の役割に反する実装の実例を挙げろって言われても……
何の事だかさっぱりです。
誰かわかるひといませんか?

No. 3835 # 68user 2004/06/30 (水) 23:19:43
>>3834 マオ猫
> …の役割
は何なのかをまず考えてみるべきでしょう。

ところで素朴な疑問ですが、これってどんな本 or 人 or 試験
からの出題ですか?

No. 3836 # 2004/07/03 (土) 21:41:41
いつも参考にさせてもらってます。
この度、仕事でSSL/TSLに対応したバッチ用のFTPクライアントが必要になったのですが、
Perlで実現できますでしょうか?
いろいろ検索してみたのですが、これといったのが見つからなくて・・・
もし何か知っていましたら、ご教授お願いします。

No. 3837 # 2004/07/03 (土) 21:43:42
ちなみに使用するサーバはRedHat Linux9.0です。

No. 3838 # 68user 2004/07/03 (土) 23:50:56
>>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 なりで呼び出すのが楽だと思われます。

No. 3839 # 68user 2004/07/04 (日) 01:45:20
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:~>

No. 3840 # 68user 2004/07/05 (月) 01:37:21
どうでもいいんですが、ここ数年モチベーションが低下して、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)
を全面的にリライトしました。

No. 3841 # naisttn 2004/07/05 (月) 15:56:50
サイト更新ありがとうございます。参考にしてます。
全文検索できないのですが。(実行に必要な権限がない。とのこと)
テスト中でしたらすみません。

No. 3842 # 68user 2004/07/05 (月) 16:17:13
>>3841 naisttn
> 全文検索できないのですが。(実行に必要な権限がない。とのこと)
掲示板の全文検索ですね?

namazu.cgi の存在をすっかり忘れてしまい、cgi-bin/wwwboard/ 以下を
閲覧不可に設定してしまいました。本日中に直します。

No. 3843 # 68user 2004/07/05 (月) 19:44:14
>>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 の書式は絶対に腐ってると思う。

No. 3844 # 68user 2004/07/06 (火) 22:07:54
UNIX の部屋
      http://x68000.q-e-d.net/~68user/unix/
を更新しましたが、たいしたことは書いていません。

No. 3845 # ニッタン 2004/07/10 (土) 02:28:05
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 でアクセスしてみよう」に追記して頂ければ、
今後同じ所で嵌る人が困らないと思います。
お忙しいと思いますが、宜しくご検討下さい。

No. 3846 # 68user 2004/07/10 (土) 03:17:59
>>3845 ニッタン
質問ですが、
    http://search.luky.org/obu/msg02180.html
    http://search.luky.org/obu/msg02181.html
と同じく、/dev/random が存在しない環境でしたか?

No. 3847 # 68user 2004/07/11 (日) 22:58:42
UNIX の部屋
      http://x68000.q-e-d.net/~68user/unix/
を更新しましたが、苦労したわりに内容はいまいちです (m4 とか)。

あと、見栄えをいじりましたが、もし見づらかったら文句言ってください。

No. 3848 # bindユーザ 2004/07/12 (月) 15:04:02
ネームサーバはプライマリとセカンダリを置いて、プライマリが障害の場合セカンダリが応答しますよね。
この仕組みはどのように実現されているのでしょうか?
仮にプライマリがダウンした直後に、プライマリに問い合わせたクライアントがあったとすると、
応答待ちでしばらくするとエラーになりますよね?(自身なし)
しかし、しばらくすると、すべてのクライアントが障害のないセカンダリにのみ問い合わせるようになりますよね?(自身なし)
この間はどのくらいの時間なのでしょうか?
どこかで調整できるのでしょうか?

No. 3849 # ニッタン 2004/07/12 (月) 16:08:20
68userさん、お返事ありがとうございます。
実は、今日会社を休んだ為、OpenSSLのバージョンはまだ判っていませんが、
/dev/randomの件は、マスタリングTCP/IP SSL/TSL編には
少し紹介されてました。

結論から言いますと、多分/dev/randomは存在しない環境かと。
サンプルのソースだとOpenSSLのライブラリー部分で、
/dev/randomに標準でアクセスしに行く様になっているでしたら
現状のサンプルのままでも問題ないかと思います。
(でも一文位あったら親切だな〜っと思ったりもします。お忙しいと思いますが)

プロキシー接続だったので、過去ログではプロキシーでしか検索していませんでした。
結局、プロキシー云々は関係なかったですが。

No. 3850 # 68user 2004/07/12 (月) 18:41:13
>>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週間ほど時間をください。

No. 3851 # hash 2004/07/12 (月) 22:16:23
>>3847 68user
チェックボタンをonにする、ラベル用途のJavaScriptでエラーが出ます。
数年前からだと思うのですが…

私は、Windows2K & ie6ユーザーです。

No. 3852 # 68user 2004/07/12 (月) 22:41:35
>>3851 hash
ありがとうございます。丸一年気づいていませんでした。
さきほど修正しました。

どうでもいいんですが、こういう用途に使える label 要素
ってのがあることをつい先日知りました。

http://tohoho.wakusei.ne.jp/html/label.htm

No. 3853 # 68user 2004/07/12 (月) 23:51:24
この掲示板の全文検索 (namazu.cgi) ですが、問題が発生したため
再び休止します。

No. 3854 # tototo [E-mail] 2004/07/13 (火) 09:33:12
お聞きしたいのですが、
Linuxでのbashシェルを使った
環境変数PATHの順番を変更するやり方を教えてください。

No. 3855 # 68user 2004/07/13 (火) 12:33:21
>>3854 tototo
お望みの PATH をそのまま設定する方が自然だと思われます。
どうしても「順番の変更」でなくてはならない理由はありますか?

No. 3856 # ニッタン 2004/07/13 (火) 13:02:44
68userさん、
お忙しいとは思いますが、よろしくお願い致します。
とっても有益な情報が沢山載っているので、
今後も役立つと思いますので、頑張ってください。

私の方でももう一度、調べてみましたが
RAND_poll()が、自動的に呼ばれる様になっていますね。
(FAQにもそれらしい事が書いてあるような気もしますね。)
私の使っている環境に移植してきた担当者が
RAND_poll()を空関数に実装し直していました。
出来れば、ERR_print_errors_fp()の存在も追記して頂けると重宝すると思います。

No. 3857 # つばき [E-mail] 2004/07/13 (火) 14:44:25
はじめまして。大学生をやっていますつばきです。
Unixのコマンドの意味でわからないことがありました。
学校の課題で「ftp」と「rcp」の違いを説明せよ、というものがありまして、
こちらのサイトでコマンドを検索してみたのですが、
「ftp」はファイルを置いてくる/持ってくる、「rcp」はファイルをコピーする、という説明が出てきました。
この二つ、特に持ってくるとコピーするの部分は同じ意味のような気がするのですが
具体的な違いは何なのでしょうか。
できれば、でよろしいのでご回答お願いします。

No. 3858 # 68user 2004/07/13 (火) 15:09:09
>>3856 ニッタン
> 出来れば、ERR_print_errors_fp()の存在も追記して頂けると重宝すると思います。
了解です。

>>3857 つばき
> この二つ、特に持ってくるとコピーするの部分は同じ意味のような気がするのですが
同じです。
    - ftp なら get するか、put するか
    - rcp なら rcp ./file host: するか rcp host:file . するか
の違いです。

わたしの思う大きな違いは Anounymous ftp という仕組みでファイルを
配布できるのが ftp、そうでないのが rcp。

後は些細な違いしかないと思いますが、それでも 10 や 20 はあげられる
かと思います。課題ということなのでいろいろ調べてみてください。

No. 3859 # samsara 2004/07/13 (火) 15:57:04
はじめまして、ネットワークプログラミングの勉強をしています。
Windows上でネットワーク関連のソフトウェアを作成したことはあるのですが、
ライブラリを使用していた為、SocketAPI等はあまり深い知識がありません。
そこで教えていただきたい事があるのですが、ここの掲示板でよろしいでしょうか?

1.WindowsのSocketとUNIXのSocketで関数の違い等あるのでしょうか?
2.UNIXのSocketでも、Linux、FreeBSD、Solaris等で違いがあるのでしょうか?

参考情報等教えていただきたいと思ってます。宜しくお願い致します。

No. 3860 # tototo 2004/07/13 (火) 16:51:20
順番変更しなければならない理由はないのですが、
PATHの順番を変更するやり方
はあるのかが気になったのため、お聞きしました。

No. 3861 # 68user 2004/07/13 (火) 21:46:58
>>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
とかですかねぇ。

No. 3862 # 68user 2004/07/13 (火) 22:24:51
ここ数ヶ月 (web 引越し前)、マルチポストしたり回答しても返事すら
書かない質問者が多く、困っていました。困るだけならまぁいいんですが、
わたしの web 更新のモチベーションを大いに下げてくれました。

というわけで、↑に書いたとおり、
      http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?howtouse
を読まない・読んでも守りたくない人は質問しないでください。
もちろん、これらのルールを守っておられる方々の質問は引き続き
歓迎いたします。

これはマナーではなく、この掲示板のルールであることに注意して
下さい。これが気にいらない方は (当然ながら) この掲示板を見ない
自由があります。

web 引越し後は以前のような不届きな質問者はいなくなったようで、
とてもうれしく思っています。

No. 3863 # samsara 2004/07/13 (火) 23:01:52
68userさま、回答ありがとうございます。
教えていただいたページをじっくり読んでみます。

No. 3864 # 68user 2004/07/14 (水) 02:36:01
>>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);

No. 3865 # つばき [E-mail] 2004/07/14 (水) 10:40:53
68user様。回答ありがとうございました。
自分なりに調べまして解決しました。助言を下さってありがとうございます。

No. 3866 # 2004/07/14 (水) 11:17:29
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ではないでしょうか
というファイルができる。

No. 3867 # ニッタン 2004/07/14 (水) 12:18:27
68userさん、はいそうです。
ここまで調べるのは苦労しませんでしたか?
私はマスタリングTCP/IP SSL/TLS編がなければ
未だに判らなかったと思います。

No. 3868 # jeiu 2004/07/14 (水) 17:44:12
ただいまSLL勉強中です。このHPも参考にさせて頂いています。
つまらない質問ですが初心者の至りということでお許しください。
ネットワークプログラミングの基礎知識 >> RSA で暗号化してみよう (1)に
暗号化のサンプルがありますが、これらの作業はOpenSSLのライブラリの中で
行われている事なのでしょうか。
たとえば、ネットワークプログラミングの基礎知識 >> SSL/TLS でアクセスしてみよう (1)
には暗号化の記述はありませんが実際には指定したプロトコルで暗号化が行われている
と思います。どこで実装されるものなのでしょうか?

No. 3869 # 68user 2004/07/14 (水) 23:15:03
>>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 のライブラリ中で記述されています。

No. 3870 # ニッタン 2004/07/15 (木) 22:09:01
>調べるのに 3日かかってますので、苦労しました。

でしたら、やはりお持ちのマスタリングTCP/IP SSL/TLS編を
辞書的に使いながら追いかける方がいいかもしれませんよ。

>でも、なぜ RAND_poll() したらエラーにならないのかいまいち
わかっていません

結局、RAND_poll()内で乱数の種をプロセスIDや/dev/randomなどを使って作成して
RAND_add()しているからだと思います。
RAND_seed()も結局、RAND_add()をしていますし。

No. 3871 # 68user 2004/07/16 (金) 02:33:49
>>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編」は調べましたが、内部構造には
触れていようで見つけられませんでした。もしどこかに載っていたら
教えてください。

No. 3872 # 68user 2004/07/16 (金) 02:58:19
>>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を使うのが楽ですし、一般的で確実かもしれません。
はそちらの環境では正常に動作しているのですよね?

No. 3873 # jeiu 2004/07/16 (金) 11:57:50
回答ありがとうございます。
もうひとつ教えてください。

>SSL/TLS はクライアントが利用可能な暗号 (正しくは暗号スイート) を
>提示し、サーバがその中から選びます。よって常に RSA が使用される
>わけではありません (DH を使う場合もある)。

クライアントから提示する暗号方式とはなにをもとに決められるのでしょうか?

たとえば、SSL V2に対応したアプリケーションとかV3に対応した
アプリケーションとかで決まることなのでしょうか?
または、Open SSL等で自力でSLLを実装するような場合は、対応できる暗号方式が
特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。

No. 3874 # 68user 2004/07/16 (金) 12:41:39
>>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を実装するような場合は、対応できる暗号方式が
> 特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。
これは意味がわかりませんでした。

No. 3875 # ニッタン 2004/07/16 (金) 12:48:04
誤解を招くような書き方をしてしまいました。
申し訳ありません。
まず、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()
と言う訳です。

貴重な時間を割かせてしまいまして、申し訳ありませんでした。

No. 3876 # 68user 2004/07/18 (日) 00:14:10
>>3875 ニッタン
更新しました。長らくお待たせしてすいません。
      http://X68000.q-e-d.net/~68user/net/ssl-1.html

詳しく説明しようとして、ドツボにはまった感がありますが、
いかがでしょうか。

RAND_status を呼べばその中から RAND_poll が呼ばれるのですが、
あえて RAND_poll を呼んでいるのは、マニュアルに書いてないこと
はなるべく前提としないでおこう、という方針だからです。

最初のサンプルプログラムがこれではわかりづらすぎるかなぁ。

No. 3877 # ニッタン 2004/07/19 (月) 12:23:11
ありがとうございます。
色々と勉強したので、私には理解できますが、
今後、初心者が読んだ場合に理解できるかはどうかは、
この掲示板にでも書き込んでくれる事を期待して、
この話題は一旦終了しましょう。

>最初のサンプルプログラムがこれではわかりづらすぎるかなぁ。

結局、/dev/randomがない環境では、種を作らないとエラーになるので
仕方ないと思います。
一応、/dev/randomがある環境では必要ないと補足してありますし。

今までありがとうございました。今後も参考にさせて頂きます。

No. 3878 # jeiu 2004/07/20 (火) 15:56:20
>> または、Open SSL等で自力でSLLを実装するような場合は、対応できる暗号方式が
>> 特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。
>これは意味がわかりませんでした。

わけのわからない質問をしてすみません。
聞きたかったのは、クライアントが決める暗号化方式はどこで定義するのか?
とういうことでした。
あるHPでは、「暗号化に関する特許などが絡んでいるため、わけのわからないものは
コンパイルオプションを使って使用しないほうがよいでしょう」と書かれていたり、
ちょっと混乱状態です。
も少し勉強が必要かなと思います。

No. 3879 # jeiu 2004/07/21 (水) 14:07:32
68user殿

No.3874の
>OpenSSL であれば SSL_CTX_set_cipher_list(ctx,ciphers) を使って好きな暗号
>スイートをセットすればよいでしょう。
のciphersには具体的にはどのような設定をすればよいのでしょうか?

いずれにしても、どの暗号化方式を利用するかは上記のようにプログラミング依存
ということになるんでしょうか?(とすると、No.3878にも書かせていただきましたが
「コンパイルオプションを使って...」は何を意味するのでしょう。ご存知でしたら教
えてください)。

No. 3880 # 68user 2004/07/21 (水) 16:09:13
>>3879 jeiu
> ciphersには具体的にはどのような設定をすればよいのでしょうか?
概念は 3874で書いたとおり
> 例えば 3DES と RC4 はいいけどDES は暗号強度が気に入らないから使わない
などです。

ソースでどう書くかという意味なら
      SSL_CTX_set_cipher_list(ctx, "3DES:RC4");

      SSL_CTX_set_cipher_list(ctx, "ALL:-DES");
などです。書き方は OpenSSL のマニュアル ciphers(1) に載っています。

> 「コンパイルオプションを使って...」は何を意味するのでしょう。
「あるHPでは」などと曖昧なことを書かずに
    http://www.ryouto.jp/linux/linux_22.html
とはっきり書いてください (上記の URL であってるかはわかりませんが)。
文脈を無視して一文を切り出されても、答える方は推測しなければ
いけないのでつらいです。たとえば上記の web であれば config で
      no-rc5 no-idea
と指定しているので、このページの作者は RC5 と IDEA の特許について
危惧しているのだなということがわかるわけです。クイズじゃないんです
から、はっきり質問したいことを書きましょう。

IDEA については SSL/TLS 上で使えますし、普通に OpenSSL をコンパイル
した場合は有効になっています。ただし FreeBSD の OpenSSL では IDEA が
使用できないようにコンパイルされていました。他の厳しめの OS (Debian
とか) でも同様かと思われます。SSL/TLS で使用できるようになっているか
どうかは
      % openssl ciphers
でわかります。

RC5 は SSL/TLS で使用できる暗号スイートに入っていないので、
問題ないでしょう。

SSL/TLS ではなく、共通鍵暗号方式として IDEA や RC5 を使いたくない
(openssl enc -e idea や openssl enc -e rc5 とできないようにしたい)
ということであれば、上記のページのようにコンパイルオプションを
設定すればよいでしょう。使用中の OpenSSL で使えるかどうかを知りたい
なら
      % openssl enc -h
で表示される Cipher Types を見ればよいです。

なお、サーバ側で制御したいのであれば、Apache などの設定ファイルで
      http://httpd.apache.org/docs-2.0/mod/mod_ssl.html#sslciphersuite
を設定してください。


今後質問される場合は、質問の背景と、何が知りたいのかを明確にする
ことをお勧めします。

例:
    - SSL/TLS クライアントを作っている
    - 〜というページに〜という記述があり、特許を侵害してしまわないか心配だ。
    - クライアント側で特定の暗号を使用しないように制御する方法はあるか?

No. 3881 # Goldwasser [URL] 2004/07/21 (水) 18:33:58
RSAもいいけど楕円曲線暗号もね。
というわけで、Rubyで素数位数の群をもつ楕円曲線を生成するスクリプトを組んでみました。

No. 3882 # ニッタン 2004/07/21 (水) 19:28:10
まだまだSSLを思考錯誤中です。

「SSL/TLS でアクセスしてみよう (2)」に記載されているサンプルについて
注意して頂きたい事があります。
HTTPSに接続後のサーバ証明書のsubjectとissuerを出力する部分で、
メモリーリークが発生する様です。

具体的には、
132: str = X509_NAME_oneline(X509_get_subject_name(server_cert), 0, 0);

135: str = X509_NAME_oneline(X509_get_issuer_name(server_cert), 0, 0);
の返り値strそれぞれを
OPENSSL_free( str )すればメモリーリークは直りました。
OpenSSLのバージョンは0.9.7aです。

OpenSSLドキュメントを見ても該当関数の事が記載されていなかったので
内部でアロケートしているかどうかソースを追っかけないと判りませんでした。

No. 3883 # 68user 2004/07/21 (水) 21:03:29
>>3882 ニッタン
> HTTPSに接続後のサーバ証明書のsubjectとissuerを出力する部分で、
> メモリーリークが発生する様です。
ありがとうございます。

      The functions X509_NAME_oneline() and X509_NAME_print() are
      legacy functions
ということなので、X509_NAME_oneline() を使うのはやめて、
X509_NAME_print_ex() に変更しました。XN_FLAG_RFC2253 に
したのは特に意味はありません。

# http://x68000.q-e-d.net/~68user/net/ssl-2.html

No. 3884 # jeiu 2004/07/22 (木) 12:56:35
ごもっとなご意見です。いろいろ推測させてしまったようです。
すみませんでした。
68userさんの推測とおり、
・SSL対応のWebクライアントを作っています。
・(Open)SSLの実装では特定の暗号化ロジックを使わないようしたい。
    公開鍵の暗号化としてRSAを使いたいが有効鍵ビットは512としたい
    共有鍵の暗号化としてRC4を使いたいが有効鍵ビットは40としたい


これまでに以下の情報をご提供いただきました。
1.使用したい暗号化ロジックは SSL_CTX_set_cipher_list()で指定
2.暗号化方式として特定のロジックを使用禁止にしたいのであれば
    コンパイルオプションを設定すればよい
について、有効鍵ビットを意識した設定は可能なのでしょか
いろんなサンプルを見ましたが、方式の設定はあっても鍵長まで意識
したものが見つかりませんでした。
また、SSL_CTX_set_cipher_list()での設定は必須になるのでしょうか。

なかなかイメージがわきません。よろしくお願いします。

No. 3885 # 68user 2004/07/22 (木) 22:18:35
>>3884 jeiu
> 公開鍵の暗号化としてRSAを使いたいが有効鍵ビットは512としたい
> 共有鍵の暗号化としてRC4を使いたいが有効鍵ビットは40としたい
では
    http://www21.ocn.ne.jp/~k-west/SSLandTLS/rfc2246-Ja.txt
の RSA_EXPORT_WITH_RC4_40_MD5 で決まりでしょう。RSA かつ
RC4 の 40bit となればこれしか選択肢がありません。

「RSA の鍵長 512bit 以下」という要件についてですが、これは
上記 RFC の
      7.4.3. ServerKeyExchangeメッセージ

          ServerKeyExchangeメッセージは (略) 以下の鍵交換方式で使用される。
                RSA_EXPORT (サーバ証明書の公開鍵が512ビットより長いとき)
          (略)
       注: 現在の米国輸出法では、米国から輸出したソフトウェアにおいては、512
         ビットより長いRSAのモジュラスを鍵交換において使用してはならない
         ことになっている。このメッセージを送信した場合、証明書内に含まれ
         ている512ビットより長いRSA鍵は、RSA_EXPORT鍵交換方式用の、512ビット
         以下の長さを持つ一時的RSA鍵に署名するのに使用される。
で自然とクリアできます。

結局、ciphers(1) に
      SSL_RSA_EXPORT_WITH_RC4_40_MD5 EXP-RC4-MD5
とあるので SSL_connect() の前に
      if ( SSL_CTX_set_cipher_list(ctx, "EXP-RC4-MD5") == 0 ){
            /* error */
      }
という処理を入れればよいでしょう。

No. 3886 # kawa 2004/07/23 (金) 12:16:04
68userさんのサイトで勉強させてもらってます。

http://x68000.q-e-d.net/~68user/net/rfc.html
こちらのページの、POPの「日本語訳」のところがリンクが失敗してる
ようですので、お知らせしておきます。

No. 3887 # 68user 2004/07/24 (土) 00:51:15
>>3886 kawa
> http://x68000.q-e-d.net/~68user/net/rfc.html
> こちらのページの、POPの「日本語訳」のところがリンクが失敗してる
> ようですので、お知らせしておきます。
修正しました。ご連絡ありがとうございました。

No. 3888 # スナフキン 2004/07/24 (土) 17:45:31
自前parseルーチンで以下の様な処理をしています。

foreach(split(/&/, $query)){
    my($name, $value) = split(/=/, $_);

〜日本語処理とかお約束の処理〜

# %FORMに格納
    if(exist $FORM{$name}){;#既に以前の$nameが有れば(2回目以降)
        push($FORM{$name}, $value);#@{$FORM{$name}}の配列に格納
    }else{
        $FORM{$name} = $value;#初めての出現ならば通常通りに格納
    }
}

細かい部分は省略してますが、例えば checkbox などで、

chbox1&val1&chbox1&val2&chbox1&val3

の様なデータが来た場合、

$ALL_VALUE = $FORM{chbox} . " @{$FORM{chbox}}";

として、

$ALL_VALUE = 'val1 val2 val3'

となる事を確認しています。

しかしなぜか、元のデータが複数の時の動作が理解できないのですが、
自分の理解が甘いような気もするので、ぜひとも動作の解説をしもらえない
でしょうか?


以下は確認用のサンプルです。2行目のコメントを外して違いを確認ください。
データの内容によって結果が違います。
変数の内容が判りやすいように print 文を入れています。

$query=qq(cbox1=1&cbox1=2&cbox1=3&cbox2=1&cbox2=2&cbox2=3);
#$query=qq(cbox1=1&cbox1=2&cbox1=3&cbox2=a&cbox2=b&cbox2=c);

    foreach(split(/&/, $query)){
        my($name, $value) = split(/=/, $_);
print qq($name=[$value]\n);

        if(exists $FORM{$name}){

            push(@{$FORM{$name}}, $value);
print qq( ->push:<$name>=[$value] count:). $#{$FORM{$name}} . qq(\n);
        }else{

            $FORM{$name} = $value;

        }
    }

print qq(Result1:[$FORM{'cbox1'} @{$FORM{'cbox1'}}]\n);
print qq(Result2:[$FORM{'cbox2'} @{$FORM{'cbox2'}}]\n);

無名配列が $value の内容によって識別できていないように見えます。

Windows版とLinux版のそれぞれ 5.6.1 で確認しました。

No. 3889 # スナフキン 2004/07/24 (土) 17:48:01
書き忘れましたが perl でのお話です。

No. 3890 # 68user 2004/07/24 (土) 18:18:52
>>3888 スナフキン
$query=qq(cbox1=1&cbox1=2&cbox1=3&cbox2=1&cbox2=4&cbox2=5);
foreach (split(/&/, $query)){
        my($name, $value) = split(/=/, $_);
        print qq($name=[$value]\n);
        if (exists $FORM{$name}){
                push(@{$FORM{$name}}, $value);
                print "\@{$FORM{$name}}=@{$FORM{$name}}\n";
        } else {
                $FORM{$name} = $value;
        }
}
print "\@1=@1\n";


cbox1=[1]
cbox1=[2]
@{1}=2
cbox1=[3]
@{1}=2 3
cbox2=[1]
cbox2=[4]
@{1}=2 3 4
cbox2=[5]
@{1}=2 3 4 5
@1=2 3 4 5

というわけで、最初のループで $FROM{$name} には 1 が入り、
@{$FORM{$name}} はシンボリックリファレンスと解釈され、結局
@1 に push しているわけです。

結局は一度目のループとそれ以降のループを分けず、常に
        push(@{$FORM{$name}}, $value);
すればよいと思いますが、そもそも何をやりたかったのかによりますかね。

No. 3891 # スナフキン 2004/07/24 (土) 20:47:20
!!!なんとなるほど!シンボリックリファレンスと解釈されたとは・・・
すばやい回答大変助かりました。ありがとうございます。

このルーチンはいくつかある他のプログラムの一部なんですが、既に$FORM{〜}
でアクセスする箇所が沢山有ったので、それらを変更する事なくという部分に
こだわりすぎました。

cgi-lib.pl とかを見るとparse時に \0 をセパレータにしてスカラーに入れて
いますが、そうではなく同名変数の配列にぶち込んじゃおうと思ったのですが
他の方法をかんがえてみます。

No. 3892 # じぇぃじぇぃ 2004/07/24 (土) 23:00:26
超初心者の質問でごめんなさい。

コマンドを入力すると、Command not found って、表示されるんです。
スペルは間違っていないのに。何が原因なのでしょうか?

また、コマンドを入力した時に、値段のような文字が、ずらっと表示される事が
あります。例:\245\242\245\257\245\273\245\271\270\242\244\254\244\242。
このようなことが起きる原因は、何でしょうか?

対処方法を教えて下さい。お願い致します。

No. 3893 # has 2004/07/25 (日) 01:15:39
>>3892 じぇぃじぇぃ
ネット上の文字のやりとりだけで環境を把握するのがちょっと大変そうですが…。

> コマンドを入力すると、Command not found って、表示されるんです。
結論から言うと、path変数が正しく設定されていないのが原因とは思いますが…。

とはいえ即解決には至れないので、まず回答にあたって次を教えてもらえますか?
・コマンドを入力するまでにどんな手順を踏むように指示されている?
・それに対しコマンドを入力するまでに実際にはどんな手順を踏んでいる?
・コマンド名は何?

> コマンドを入力した時に、値段のような文字が、ずらっと表示される事があります。
これも次を教えてください。
・使っている機器はPC?
    ・WindowsからTelnetやTeraTermなどを実行して開いたウィンドウで起こっている?
    ・それともPC上では直接Solarisやlinuxが動いていてそこで起こっている?
・機器はPCではなく大学の研究室かどこかのワークステーション?
・機器はワークステーションではなくX端末?


なお、この書き込みに関係なくすでに解決した場合でも、何をどうしたらうまく
できたのか、必ずここに書き込みしてください。

とりあえず今回は、質問するというだけでも一苦労だったとは思いますが、
回答する側もスムーズかつ効率的に解決する技術を習得しようとしている面も
あるので、質問する側としてもその時点でわかっていることをできるだけ
きちんと伝えることが大切かと思います。ぜひ実践していってください。

# まあそうは言っても、何が前提で、伝えるべき情報がどれなのかがわからなくて
# 余計困っているんだとは思いますが

No. 3894 # 68user 2004/07/26 (月) 00:11:55
ネットワークプログラミングの基礎知識に
    「*BSD で kqueue・kevent を使ってみよう」
          http://X68000.q-e-d.net/~68user/net/c-kqueue-1.html
を追加しました。

>>3892 じぇぃじぇぃ
> コマンドを入力すると、Command not found って、表示されるんです。
こちらもご参考に。
http://X68000.q-e-d.net/~68user/unix/pickup?Command+not+found

No. 3895 # じぇぃじぇぃ 2004/07/26 (月) 01:03:07
has 様。

ご丁寧なお返事ありがとうございます。

・コマンドを入力するまでにどんな手順を踏むように指示されている?
・それに対しコマンドを入力するまでに実際にはどんな手順を踏んでいる?
→サーバーにログインして、プロンプトを表示させる。
    (ここまではOK)その後、以下のような操作(コマンドの入力)を
    実行しています。
    
    nslookup www.○○○○○○.ne.jp
                                    ↓
                        (見つからない)
                                    ↓
    find /usr/bin -name nslookup -print
                                    ↓
                        (見つからない)
                                    ↓
    find /usr -name nslookup -print
                                    ↓
                        (見つからない)

・コマンド名は何?
→nslookup

・使っている機器はPC?
→Windows Xp

Prev< No. 3801〜3895> Next  [最新発言に戻る] [過去ログ一覧]