|
@68userさん >> それとsnprintfというのはsprintfのことでよろしいのでしょうか。 >失礼ながら、man の見方はご存知でしょうか? man snprintf です。 manの見方は知っていましたがほとんど使ったことがなく、C言語辞典の ようなものにも載っていなかったものでてっきり近くに載っていた sprintfだと思っていました。 >snprintf(name, sizeof(name), "name%02d", i); お教えいただいた日本語マニュアルHPの方を見ました。 で、読んだ結果snprintfの前にprintfもなんだか わからなくなってきてしまったので、"name%02d"の部分について 確認させてください。まず、「%d」と書けば整数を表示させると 思いますが、その前の「2」というのは整数二桁の精度ということですか? あと、その前の「0」はiが一桁の時、01、02、・・・のように「0」を いれてくれるということでしょうか。 そしてsizeof(name)についてですが、これがあるsnprintfと、 ないsprintfの違い(両方ある必要性?)がいまいちよくわかりません。 snprintfではsizeof(name)の容量を超えるものを 一番目の引数のnameに入れることを許さない ということなのでしょうか??う〜ん・・・。 |
|
はじめまして。 Perlで質問があります。 パケットを送るときにその容量を どうやって指定するのですか? 例えば1000バイトをUDPで送りたい場合 どうすればいいんでしょうか? そのパケットの作成方法がわかりません。 よろしくお願いします。 |
|
@gongo さん > manの見方は知っていましたがほとんど使ったことがなく わからなければ、とにかく man です。まずマニュアルを読まないと、 理解できる/できないというレベルにさえたどり着けませんから。 > printfもなんだか わからなくなってきてしまったので、 ま、これは宿題ということで。いろんな値を %d, %2d, %02d で 表示させてみればわかるでしょう。 # printf(3) は、よく使うわりにわかりにくいマニュアルの # 代表だと思うので、あまり気にしなくてよいと思います。 > これがあるsnprintfと、ないsprintfの違い snprintf だと、適切な値を第二引数に与えれば、いかに 生成される文字列が長くても、その領域を越えて書き込む ことはありません。要は、バッファオーバーラン対策です。 strncat/strncpy/strlcat/strlcpy も同じです。 @ケイさん > パケットを送るときにその容量をどうやって指定するのですか? > 例えば1000バイトをUDPで送りたい場合どうすればいい > んでしょうか? C の send/sendto と違い、perl の send では長さを与える 必要はありません。perl 君がよきにはからってくれます。 > そのパケットの作成方法がわかりません。 まさか IP データグラムを自前で作る、とかいう話じゃないですよね? |
|
@68userさん > ま、これは宿題ということで。いろんな値を %d, %2d, %02d で で、やってみたところ %d は左寄せで0,1,2,・・・というようになり、 %2d は二桁分書く場所を確保しつつ、値が一桁なら十の位を 空白で埋め(見ため右寄せ)、%02d は二桁分書く場所を確保しつつ、 値が一桁なら十の位を0で埋めていました。 > snprintf だと、適切な値を第二引数に与えれば、いかに > 生成される文字列が長くても、その領域を越えて書き込む > ことはありません。要は、バッファオーバーラン対策です。 なるほど、わかりました。 プログラムは snprintf でうまくいきました。 |
|
68user-sanこんばんは、 HTTPクライアントのサンプルコードを少し変更してある特定のサイトの CGIに任意のデータを渡しリードしたHTMLを表示するCGIファイルを作り ました。リードしたHTMLをブラウザに出力する前にリンク先等を変更 して出力したいのですが良い方法がありましたらお知らせください。 例)リードしてきたHTMLのファイル等のリンク先が ./hogehoge/hoge/hoge1.jpgの場合ブラウザに出力する前に ./hoge_hoge/hoge1.jpgに変更してブラウザに出力する。 |
|
@konanさん 68userさんでなくて申し訳無いですが・・・ #しかも多分役に立たない内容です。スミマセン ただのテキストのやり取りなワケですから、 いったん読み込んだHTMLをブラウザに渡す前に 内容を書き変えてやれば良いだけですよね? そう言う話でなくて、その書き換えのやり方を聞いてらっしゃるのなら それは答えようの無い話だと思います。 それを考えるのがプログラマの仕事なワケですから。 |
|
>まさか IP データグラムを自前で作る、とかいう話じゃないですよね? IPデータグラムって要はパケットのことですよね? 自前で作ることになるのかな?よく分かりませんが 例えば、適当なゴミパケットを送りたい時はどうすればいいですか? そのゴミパケットの作り方を教えて頂きたいです。 別に中身のあるデータじゃなくていいんです。 |
|
@konan さん > ./hogehoge/hoge/hoge1.jpgの場合ブラウザに出力する前に > ./hoge_hoge/hoge1.jpgに変更してブラウザに出力する。 s|\./hogehoge/hoge/|\./hoge_hoge/|g とかそういうことですか? @hsj さん > 68userさんでなくて申し訳無いですが・・・ 言うまでもないですけど、どなたでもご自由に回答して いただいて結構でござんす。 @ケイさん 普通、パケットを自前で作ると言えば GET /index.html HTTP/1.0 というようなアプリ層のプロトコルに、TCP ヘッダを付けて TCP セグメントを作ったり、さらに IP ヘッダを付けて IP データグラムを作ったりすることを指すような気がします。 こういうレベルの処理は、普通 OS がやってくれるものです。 > 例えば、適当なゴミパケットを送りたい時はどうすればいいですか? こういうアプリケーション層のプロトコルは、クライアントと サーバが協調して動けばいいので、クライアントとサーバ 両方を作るならば、プログラマが勝手に決めればよいです。 send(SOCKET, 'hoge', 0, pack_sockaddr_in(1234,inet_aton('10.0.0.1'))); というふうに。 ところで UDP の解説って需要あるのかしら。Perl/Tk で IP Messenger http://www.asahi-net.or.jp/~VZ4H-SRUZ/ipmsg.html を作りかけたんだけど、途中で飽きちゃってそのまま… (実用レベルではありません)。UDP の解説を書こうとしたんですが、 あんまり読みたい人もいないかなと思って、未着手です。 ちなみにこの IP Messenger を作ろうとすると、UDP は理解できるわ、 ブロードキャストもバッチリだわで、とても勉強になります。時間の ある方、チャレンジしてみては。 |
|
昨夜68userさん宛てにメールで質問してしまい、失礼しました。 掲示板なるものがあるんですね。 さっそくですが、 もしどなたか知ってる方がいらっしゃったら教えてほしいのですが。 GETの場合 HTTPアクセスするときに http://www.foo.com/bar.cgi?data1=hoge&data2=fuga とすることで結果(HTMLソース等)を取得できますよね。 でも、 POSTの場合 このdata1=hoge&data2=fugaを見せないようにするために ストリームでサーバに送信しますよね。 でも、この送信部分を自分で作成した時にどのように 送信すれば良いのかが不明です。 言語はJavaです。 Javaだと、どのストリームに変換すれば良いのか、データにヘッダ情報 のようなものが必要なのかも不明ですし、実際の通信ではどのソケットを 開いてサーバ側と接続すれば良いのか全く分かりません。 他の言語でも良いのですが(可能であればJava)、 プログラム自身がPOSTでデータを送信して結果(HTMLソース等)を取得する ようなサンプルコードってないものでしょうか? |