68user's page 掲示板

Prev< No. 4020〜4039> Next  [最新発言に戻る] [過去ログ一覧]
No. 4020 # NL 2004/10/26 (火) 23:08:07
>>4017 さいさん
>>4018 68user

>du -k | sort -nr | awk '{ system("echo -n `echo "$1"*1024 | bc`"); printf(" %s\n", $2) }'

サーバとかOSのバーションとか記述されてませんでしたけど、
「echo -n」は、依存しませんでしたか。

No. 4021 # さいさん 2004/10/27 (水) 09:50:10
>>4107 68user

>>4018 68user
>du -k | sort -nr | awk '{ system("echo -n `echo "$1"*1024 | bc`"); printf(" %s\n", $2) }'

shかcshで異なるみたいです。

バークレイ版では、「\c」 エスケープを「-n」オプションで代用することができます。
echo が csh(1) の組み込み関数として用いられている場合には、バークレイ方式に
従っています。

#du -k $1 | sort -nr | awk '{ system("echo `echo "$1"*1024 | bc` \\\\c"); printf(" %s\n", $2) }'
で、できました。

No. 4022 # ken [URL] [E-mail] 2004/10/27 (水) 23:42:33
こんにちは

kenといいます。

Winsockを使ってネットワークの勉強してまして大変勉強になりました。
ソケットプログラミングを進めていくうちにどうしてもわからない点が発生
したので、もしよろしければとおもいメールしました。

問題はSend()/Recv()でパケットサイズを超えるデータを連続で
送受信させたいのです。
パケットを超える送信をするにはsend()の引数にバッファ、サイズを
そのままのっければ、自動でパケットサイズに切り分けて送信してる
のを確認しました。ですが、受信終了を示す返り値のlengs=0を受信
できませんでした。どうも送ってないようです。httpサーバーに接続して
受信をためしたのですが、lengs=0を確認でき連続で受信することができました。
recv()での受信lengs:0はシャットダウンを意味するとの記述も見つけたのですが、
shutdown()では送信復帰ができないので、使えません。

パケットサイズを超えるデータを連続で送信し受信する時、
受信データの終了を送信したり、受信するにはどうすればいいので
しょうか?
サーバーがファイルの終了を示すleng=0を送信するのは
なにか命令があるのでしょうか?
ソケットをシャットダウンするとleng=0を送信できますが
シャットダウンを復帰できないはずですがしてるのでしょうか?

よかったらレスお願いしますm(__)m
page:homepage3.nifty.com/MIDI-EDITOR/
mail:NQD00781@nifty.com
ken

No. 4023 # 68user 2004/10/28 (木) 03:18:37
>>4022 ken
TCP ですか? それとも UDP ですか?

> パケットサイズを超えるデータ
パケットサイズって具体的に何のことを指していますか?

> 受信終了を示す返り値のlengs=0を受信できませんでした。
送信側で close か shutdown しましたか?

> shutdown()では送信復帰ができないので、使えません。
送信復帰って何ですか?

No. 4024 # どっかん 2004/10/28 (木) 13:12:28
sedを使用して先頭1行目のみ置換を行い、
すべてを出力させたいのですが、どうすれば
よいですか。

sed 's/o=test$/o=honban/g'
とすると置換は行われますが、先頭1行目のみ
だけしたいのです。

CM1: id=00001,nm=test,o=aaa,o=test
CM2: mod
CM3: option
-
CM4: ftp
CM5: get


CM1: id=00001,nm=test,o=aaa,o=honban
CM2: mod
CM3: option
-
CM4: ftp
CM5: get

No. 4025 # ken 2004/10/28 (木) 16:41:37
>TCP ですか? それとも UDP ですか?
TCPです。

>> パケットサイズを超えるデータ
>パケットサイズって具体的に何のことを指していますか?
send()/recv()での送信、受信レングスです。
この場合では、Recv時のレングスです。

>> 受信終了を示す返り値のlengs=0を受信できませんでした。
>送信側で close か shutdown しましたか?
サーバー側でデータを送信し、終了したらshutdown/closeを行うべき
なのでしょうか? 確かにレングス0を受信できますが、その後に
送受信を必要な場合はどうすればいいのでしょうか?
httpサーバーにアクセスした時はレングス0が帰ってきたのですが、
shutdownしていたのでしょうか?


>> shutdown()では送信復帰ができないので、使えません。
>送信復帰って何ですか?
送信の終了を示す、レングス0を送るためにclose/shutdownを使うと、
その後にアクセスができなくなる。
shutodownしたソケットを再使用は危険とMSDNにでてます。

No. 4026 # zsh 2004/10/28 (木) 18:59:37
>>4024 どっかん
sed -e '1s/o=test$/o=honban/'

No. 4027 # 68user 2004/10/28 (木) 19:21:13
>>4025 ken
要は、ピアが送信したデータが全部届いたことを確認したいのですか?
それならば、TCP/IP のレベルではなくアプリケーションのプロトコル
レベルで実現するのが普通です。

例:
    - 送信側は「データ長 + データ」を送信。受信側は最初に受け取った
        データ長の分だけデータを受信したら、全データ到着とみなす。
    - 改行コードをプロトコルのひとまとまりとみなす。送信側は
        データの末尾に改行コードをつけて送信。受信側は改行コードを
        受け取ったら全データ受信とみなす。

端的に言うと、
    recv の戻り値が 0 = FIN が届いたとき
です (ノンブロッキングモードなどの例外はあるかと思いますが)。

で、FIN を投げるには close か shutdown する必要があるということです。

No. 4028 # ken 2004/10/29 (金) 11:47:04
レスありがとうございました。m(__)m
>要は、ピアが送信したデータが全部届いたことを確認したいのですか?
はい。
>それならば、TCP/IP のレベルではなくアプリケーションのプロトコル
>レベルで実現するのが普通です。
httpサーバーにつなげてhtmlを受信した場合に受信終了時にrecv()戻り値が
0を送っていたのは、shutdown()がかかっていたと判断していいのでしょうか?
だとすれば、再度htmlを受信する場合は、再度acceptでsocketを作成して受信
開始する必要があるのかテストする必要を感じました。

何度もレスいただきましてありがとうございました。

No. 4029 # 68user 2004/10/29 (金) 12:37:29
>>4028 ken
> shutdown()がかかっていたと判断していいのでしょうか?
http サーバが shutdown か close したと判断してよいです。

> 再度htmlを受信する場合は、再度acceptでsocketを作成して受信
> 開始する必要があるのかテストする必要を感じました。
再度接続する場合は、クライアント側は socket を生成して connect
しなおす必要があります。サーバ側はリスニングソケットは listen
しっぱなしなので、クライアントが接続しなおしてきたら accept すれば
よいです。

ただし毎回接続・切断を繰り返していては性能が出ないため、HTTP/1.1 に
おいて keep-alive やパイプラインなどの、コネクションを切断せずに
複数のデータを取得するための仕組みが考案されているわけです (これも
アプリケーション層での工夫です)。

No. 4030 # sugimoto 2004/11/01 (月) 19:46:38
>>4001 68user
2週間程前PEM形式ファイルの読み込みで質問した者です。
なんとか手元を離れたので簡単に報告です。
処理は68user様のご指摘の通り行う事で全て対応できました。
色々ありがとうございました。
行ったのは以下の3処理です。
・PEM_read_RSAPrivateKey()でPEM形式ファイルを読み込む処理
    パスワード付きの場合の処理で少し苦労・・・
・RSA_private_encrypt()で暗号化する処理
・Base64エンコードの要求があったので、EVP_EncodeBlock()でエンコー
    ド処理
出来上がれば単純なのですが、着手した時は全くの白紙状態でしたので
本当に助かりました。有難うございました。

No. 4031 # 上田 [E-mail] 2004/11/02 (火) 15:36:15
いつも参考にさせていただいております。
初めて投稿します。
上田といいます。
よろしくお願いします。

『echo サーバを作ってみよう (3)』を参考にして、echoサーバを作成してみました。
概ねはうまくいきました。
しかし、おそらく子プロセスのものだと思うのですが、defunct(ゾンビ)が残ってしまいます。
このdefunct(ゾンビ)をうまく消す方法はないものでしょうか?

ちなみに、私の環境は
Cobalt LINUX 5.0
です。

もし、私の勘違いでしたらすみません。お許し下さい。
以上、よろしくお願いいたします。

上田

No. 4032 # 68user 2004/11/02 (火) 16:30:46
>>4031 上田
> このdefunct(ゾンビ)をうまく消す方法はないものでしょうか?
サンプルプログラムでは wait をさぼっているためゾンビが残ります。
サンプルを直そうと思いつつ、はや 2年近く経ってしまいました。

ひとつのやり方として、
>>2584 persianopeh
のように SIGCHLD をキャッチする方法があります。あるいは WNOHANG を
指定して waitpid してもよいです。

No. 4033 # 上田 [E-mail] 2004/11/03 (水) 12:09:01
>>4032 68user

68userさん、ありがとうございます。
教えていただいた $SIG{CHLD} = sub { wait }; ですが、不勉強なもので、記述する場所に若干の不安が残っています。
一応、43行目と44行目の間に記述したところ、次の3つは達成できました(目的は達成できました)。
・サーバ機能
・複数同時アクセス
・defunctの消去
もし記述する場所が間違っていれば、またご連絡いただけないでしょうか?

      36: # forkで子プロセスを生成
      37: if ( $pid = fork() ){
      38: # こちらは親プロセス
      39: print "親プロセス($$): 引続きポート $port を見張ります。\n";
      40: print "親プロセス($$): クライアントの相手はプロセス $pid が行います。\n";
      41:
      42: # 親プロセスはソケットをクローズ
      43: close(CLIENT);

                              $SIG{CHLD} = sub { wait };  #←←←ここに追加しました。

      44: next;

以上、ありがとうございました。
今後ともよろしくお願いいたします。

上田

No. 4034 # noza [E-mail] 2004/11/04 (木) 16:21:49
Cシェルの中で、sqlplusに接続してsqlを実行して結果を表示したいのですが、どのようにすればよいですか?
皆さん、教えてください。よろしくお願いします。

No. 4035 # アトヌル 2004/11/04 (木) 19:26:06
始めまして。
sedコマンドで、改行を含む文字列へ変換したいのですが、どのようにすればいいですか?

abcde
------
fgh
ijk

たとえば、abcdeをfgh(改行)ijkとしたい場合、

sed "s/abcde/fghijk/g" file1 > file2
これでは改行無しで置換されてしまいます。
\n,\r\nなど埋め込んでみましたがうまくいきませんでした。

皆さん教えてください、宜しくお願いします。

No. 4036 # 2004/11/04 (木) 19:34:08
Cシェルの中で、コマンドオプションの有無を判断するのには、どのようにIF文を書けば良いですか?
教えてください、よろしくお願いします。

No. 4037 # zsh 2004/11/06 (土) 19:36:04
>>4034 noza
ヒアドキュメントを使うとできた筈ですが
sqlplusの引数でユーザ名とパスワードが必要になるため
お勧めしません。

>>4035 アトヌル
sedでは確か無理だったと思います。
(嘘ついてたらごめんなさい。)

>>4036
コマンドオプションって何ですか?引数の事?

No. 4038 # 68user 2004/11/08 (月) 13:49:29
>>4033 上田
fork の前にシグナルハンドラを設定するのが普通かと思います。でないと、
設定前にシグナルが飛んできたら困りますので。

ただしシグナルハンドラは子プロセスに引き継がれるので、fork 後に
シグナルハンドラを戻すなどの対処が必要です (この例では子プロセスが
SIGCHLD を受けることはないので、どちらでも構わないのですが)。

>>4037 zsh
> ヒアドキュメントを使うとできた筈ですが
ヒアドキュメントでもいいし、別ファイルにしておいて
      sqlplus $user/$pass @hoge.sql
としてもよいです。

> sqlplusの引数でユーザ名とパスワードが必要になるためお勧めしません。
これはまぁいいんじゃないですかね。Perl で Oracle に接続しても
スクリプト中にパスワードを書きますし、Pro*C でもバイナリを
strings すればわかりますし。

No. 4039 # yamaさん [E-mail] 2004/11/08 (月) 21:26:09
yahooオークションの自動ログインシステムをプログラムしていますが、ログインできません。
どなたかご教授願います。以下にソースを掲載しておきます。

import java.net.*;
import java.io.*;

public class post {
    public static void main(String[] args) {
        try {
            int start = 0;
            PrintWriter pw = new PrintWriter
                        (new BufferedWriter(new FileWriter("post.html")));

            // URLクラスのインスタンスを生成
            URL helloURL =
                        new URL("http://login.yahoo.co.jp/config/login");

            // 接続します
            URLConnection con = helloURL.openConnection();
            // 出力を行うように設定します

            con.setDoOutput(true);
            con.setDoInput(true);

            con.setRequestProperty("Cookie","B=banotfp0orfbj&b=2");

            con.setRequestProperty("Accept-Language", "ja");
            con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");

            // 出力ストリームを取得
            PrintWriter out = new PrintWriter(con.getOutputStream());

            out.print(".tries=1");
            out.print(".done=http://page7.auctions.yahoo.co.jp/jp/auction/g25311966?");
            out.print(".src=auc");
            out.print("lg=jp");
            out.print(".intl=jp");
            out.print("login=********");
            out.print("passwd=*******");
            out.close();


            // 入力ストリームを取得
            BufferedReader in = new BufferedReader(
                                                                new InputStreamReader(
                                                                con.getInputStream(),"JISAutoDetect"));

            // 一行ずつ読み込みます
            String line;
            while ((line = in.readLine()) != null) {
                // 表示します
                pw.println(line);


            }


            // 入力ストリームを閉じます
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

post.htmlにはログインされた後の商品ページが表示されます(ログインできれば)

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