68user's page 掲示板

Prev< No. 1490〜1590> Next  [最新発言に戻る] [過去ログ一覧]
No. 1490 # 68user 2000/12/21 (木) 21:47:15
>>1488 Qさいとう
> 今fork関数を使い,二つのプロセス,
>  1)表示画面にイヴェントが発生したら処理するプロセスと
>  2) 時間監視を行っているプロセス
> を作成しました.
X サーバとの通信の実態は、ソケット経由でのデータのやりとりです。
大抵は (同一ホスト内なら) /tmp/.X11-unix/X0 経由です。
# つまり UNIX ドメインソケットを使う。

で、ソケットを作成したあと fork して、複数のプロセスが
ソケット共有するのは多分うまくいかないでしょう。
# そういう構成であるとは書いてありませんので推測ですが。

クライアント→サーバは OK かもしれませんが、サーバ→
クライアントのデータは親プロセスか子プロセスのどちらに
渡るかが決まっていないからです。

というわけで、そもそも構成がまずいと思います。1プロセスで
できませんか? Xt は知らないのですが、何かコールバック関数を
登録できる仕組みがあると思います。

仮に複数プロセスでやるとしても、X サーバと接続する前に
fork して、片方は X サーバとの通信、もう片方は監視などと
役割分担し、両プロセスの間はパイプやシグナルやソケット経由で
やりとりすべきでしょう。

>>1487 68user
>> よければ、こちらの方にURLを教えていただけないでしょうか?
> はい、後ほど送ります。
あ、まだ送ってなかったかもしれない。今日明日はちょっと
無理かもしれないので、すいませんが気長にお待ちくださいませ。

No. 1491 # 酒井 [E-mail] 2000/12/22 (金) 17:53:48
「UNIXの部屋」で

telnet リモートホストにログインする  という項目がありました。


ここで 自動的にログインし、自動的にコマンドを実行するには sleep の項のサンプルを参照。
                (コマンド sleep *)

とありますが、sleepの項では、下記のようになってます。


                sleep 指定秒数だけ動作を止める
                5分間 (300秒) 動作停止するには

                % sleep 300

                とする。sleep コマンドは、スクリプトの中で使うことが多い。

                % ( echo username ; sleep 1 ; echo password ; sleep 1 ; echo ls ; sleep 1 ) | telnet foo.bar.com

                なんてこともできたりする。

                (日本語マニュアル sleep)


実際に自動的にログインし、自動的にコマンドを実行したい場合はどうすれがいいのでしょうか


誠に勝手なお願いですが、ぜひ教えてください。

No. 1492 # 68user 2000/12/23 (土) 14:13:45
>>1491 酒井
> 実際に自動的にログインし、自動的にコマンドを実行したい場合は
> どうすれがいいのでしょうか
そこに書いてある
    % ( echo ... sleep 1 ) | telnet foo.bar.com
ではダメだったのでしょうか。

まぁ普通は ssh や rsh を使いますね。
    http://X68000.startshop.co.jp/~68user/unix/pickup?keyword=rsh&target=command#rsh
    http://www.jp.FreeBSD.org/QandA/HTML/1576.html

No. 1493 # 68user 2000/12/23 (土) 15:20:34
古い話ですが
>>1380 book
> gcc -c share_test.cc
> ar cr libtestshare.so share_test.o
> ranlib libtestshare.so
> CC test_gcc.cc -L. -ltestshare
gcc に -g オプションを付ければいける、と fj で読んだような
読んでないような。

>>1484 SabaCurry
メールで送りました。

No. 1494 # CoreFighter 2000/12/30 (土) 23:28:20
BIOSの設定画面で、MPSってありますけど
Versionの1.1と1.4の違いってなんでしょうか?

No. 1495 # Abe [E-mail] 2000/12/31 (日) 04:58:45
ある日突然?起動音が出なくなり、サウンドはすべて聞えなくなりました。[リソースの競合に遭遇し、自己流で、[コントロールパネル]-[システム]-
デバイスマネージャー]より、「はてなマーク」のものを削除して、
[サウンド関連のデバイス]を手動設定変更し、競合を避けることができ、
デスクトップ右下にスピカーが表示され音が出るようになったのですが、
再起動するたびに、「PCI Universal Sirial Bus」の入手案内が表示され、キャンセルボタンを押してからでないと、正常に作動を開始しません。起動の度に案内画面が出ないようにするにはどうすればよいでしょうか?

No. 1496 # アイスクリーム [URL] 2001/01/03 (水) 08:34:43
    チャトって、どこですか???

No. 1497 # ふくし 2001/01/03 (水) 20:06:29
あけましておめでとうございます。本年もよろしくお願いします。
別のことをやっていて偶然発見したんですが、

------------------------------ foo
#! perl
use strict;

my $n = 17; # 普通の変数
print "---> $\$n\n"; # リファレンスしていきなりデリファレンス

------------------------------
% perl -w foo
Use of uninitialized value in concatenation (.) or string at foo line 5.
---> 17

結果は確かに出てるんだけど、なんかundefの変数を二重引用符に入れたときと同じ
警告メッセージが出ます。これはなぜでしょう?

No. 1498 # mm 2001/01/03 (水) 22:29:52
>結果は確かに出てるんだけど、
↓を試してみて下さい。
my $n = 17; # 普通の変数
$\ = '<OUTPUT RECODE SEPARATOR>';
print "---> $\$n\n"; # リファレンスしていきなりデリファレンス

↓こっちも
my $n = 17; # 普通の変数
print "---> ${\$n}\n"; # リファレンスしていきなりデリファレンス

No. 1499 # 68user 2001/01/04 (木) 16:53:48
>>1494 CoreFighter
> BIOSの設定画面で、MPSってありますけど
> Versionの1.1と1.4の違いってなんでしょうか
MultiProcessor Specification の略ですが、詳しいことはさっぱりです。
現状では ACPI に取って変わられたんじゃないかな。具体的なことは
intel のサイトあたりに仕様書が転がってるかもしれません。

No. 1500 # ふくし 2001/01/04 (木) 17:39:57
>mmさん
あー、、、(^^;;;;; すいませんでした。
どうもありがとうございます!

No. 1501 # E田 2001/01/04 (木) 17:43:36
UNIXで、C言語で、TCP/IPを使って、クライアント/サーバ(マルチクライアントがアクセスする。非ブロッキングという)プログラムをしています。
selectを使用して、特定の、クライアントが接続しているソケットのタイムアウトを知りたいのですが、その方法が、良くわかりません。
こちらの方が詳しいということなので、ぜひ教えてください。
お願いします。本を読んでも、良くわかりませんでした。

No. 1502 # 68user 2001/01/04 (木) 17:54:58
>>1501 E田
現状はどこまでわかっているんですか?

何もわからないなら、まずは
    http://X68000.startshop.co.jp/~68user/net/c-echo-1.html
を読んでください。で、ソケットを使えるようになると。

で、perl ですが、select の使い方はこんな感じ。イメージをつかんで下さい。
    http://X68000.startshop.co.jp/~68user/net/echo-4.html

んで、C での select(2) の使い方。
    http://home.jp.FreeBSD.ORG/cgi-bin/showmail/FreeBSD-users-jp/54916
    http://home.jp.FreeBSD.ORG/cgi-bin/showmail/FreeBSD-users-jp/54917

わからなければ、作ってるソースから余計な部分をそぎ落としたソースを
公開して、再度質問してください。

No. 1503 # inpaku 2001/01/04 (木) 20:50:44
こんにちは。ネットワークプログラミングについて質問があるのですが…。
現在、Debian Linuxをもちいて、簡単なプログラミングから練習している
のですが、いき詰まりました。
PF_PACKETをつかってデータリンクに直接データを渡したいのですが、
ethhdrのh_dest や h_sourceにどうやってMACアドレスを入れて良いか
解らなくなりました。IPアドレスでは、inet_ptonとかあったんですが、
MACアドレスの場合もあるのですか??
宜しくお願いします。

No. 1504 # 68user 2001/01/04 (木) 23:22:14
>>1503 inpaku
> 簡単なプログラミングから練習しているのですが、いき詰まりました。
ははぁ、「簡単なプログラミングから練習」で、いきなりデータリンク層ですか。
僕にはちょっと荷が重いなぁ。

確認ですが、非 TCP/UDP かつ 非 IP のデータを送りたいのですよね?

UNIX Magazine 2000年7月号「BSD をハックする - 齊藤明紀」で、
    - 非 IP のプロトコルを使うにはどうすればよいか
    - 送信する Ethernet パケットに含まれる MAC アドレスを自由に
        設定することはできるか
について、NetBSD での解説が書かれています。

また、「UNIX ネットワークプログラミング第2版 Vol.1」
    http://X68000.startshop.co.jp/~68user/net/link-book.html#8
では、データリンクへのアクセス手法として、
    - BSD の BPF (BSD Packet Filter)
    - SVR4 の DLPI (SVR4 Data Link Provider Interface)
    - Linux の SOCK_PACKET
の3つがあげられています。どうやらここらへんは OS により
API がまちまちらしいですね。実際、手元の FreeBSD 4.2-BETA
では (PF|AF|SOCK)_PACKET という定数は定義されていません。

で、この本によると Linux の SOCK_PACKET を使うなら
    fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL));
とすると、データリンクからすべてのフレームを受けとれる
らしいです。

あと、tcpdump が使用している libpcap というライブラリが
上記3種の方法に対応しているようなので、参考になるかも
しれません。
# libpcap は読み出ししかできませんが、送信に対応させるのは
# それほど面倒ではないとか。

> IPアドレスでは、inet_ptonとかあったんですが、
> MACアドレスの場合もあるのですか??
BSD には libc に ether_aton とか ether_hostton てのがあります。
Linux はどうですか?

くぅ、面白い話題だけど、調べるのに一杯一杯だ。

No. 1505 # inpaku 2001/01/05 (金) 00:07:02
68userさんへ
親切にお答え下さって、ありがとうございます。
ether_aton とか ether_hostton ですか、探してみます。
実は僕もUNIX ネットワークプログラミング第2版 Vol.1を
持ってますが、はっきりいって、C言語すらおぼつかない僕
には辛いです(笑)
たしかにLinuxではSOCK_PACKETを使うと本には書いてあり
ましたが、Kernel2.2以降?からはPF_PACKETを使えと、man
ページに書いてあったものですから、それを使ってます。
また、libpcapのソースも落としましたが、書き換えるのは
僕には不可能でした(苦笑)
ところで、僕は何をしたかったのかというと、自分で任意の
プロトコルをつくってそれで通信させてみようということだ
ったんです。無謀とお思いでしょうが、やらなきゃならんの
です。卒業のために…。とにかくがんばってみます。
ありがとうございました。

No. 1506 # E田 2001/01/05 (金) 11:52:25
早速、回答してくださいまして、ありがとうございます。
どこまでわかっているか、ということなので書きますが、
ソケットの生成とかは、できています。
サンプルとかを真似して、クライアント/サーバで動かしてみました。
fork()で、マルチクライアントにもできています。
でも、select()を組み合わせると、よくわかりません。
動作は、教えてもらったページとかで、なんとなくわかるのですが、
それをCでやろうとすると、わからなくなります。
select[1]とかと書いて、タイムアウトの時間を指定してやると、
それをすぎても読み出せない時にはタイムアウトしたっていうことで
検出できるんですか?
よろしくお願いします。

No. 1507 # E田 2001/01/05 (金) 11:54:12
追伸です。
ソースとかは、まだ、ほとんど、サンプルとかのechoサーバとかなので、
書きませんでした。

No. 1508 # E田 2001/01/05 (金) 12:14:52
すみません、もう一つ質問です。
送信するデータで、データの最初に全データの長さが入っていて、
その次に、データのIDが入っていて、その後にデータの本文が
入っているというものを受信する時の方法についてなんですが、
それを読む時、最初のデータの長さとIDを読んで、その後で
データの本文を読みたいのですが、構造体みたいなのを用意して、
そこに格納しようと思っています。
データの長さはu_longで4byteで、
IDは、0x00100101(u_longで4byte)とかという番号で、
データの本文は、u_shortで2byte+longで4byte+char[8]です。
socketでの送信用のchar型からキャストしてみようと
しているんですが、最初の00がうまく行きません。
(送信する時のキャストはうまく行っています。受信する時は、
ちゃんと全部、もとのままのデータを受け取っています。)
これは、socketの扱い方の方のhton()とかでやらないと
いけないのですか?
それから、もしかすると、Cの方の書き方が下手糞なせいなのかも
しれないのですが、構造体に格納するのがうまく行かないので、
たとえばで良いので、もしも良かったら、例を教えてくれませんか?
お願いします。

No. 1509 # 68user 2001/01/05 (金) 12:56:19
> 最初の00がうまく行きません。
うまく行かないプログラムを (余計な部分は削った上で)
公開してください。

はい、C+select の超手抜きサンプル。バグありまくりですが
一応動きます。細部は参考にせず、おおまかな流れを見て下さい。

------------------
#include <stdio.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/uio.h>
#include <unistd.h>
#include <sys/param.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define BUF_LEN 256 /* バッファのサイズ */

int main( int argc , char *argv[]){
    int connected_socket[100];
    int listening_socket;
    struct sockaddr_in sin;
    int sock_optval = 1;
    int port = 5000;
    char buf[BUF_LEN];
    struct timeval waitval;
    fd_set fd;
    fd_set org_fd;
    int max_sock = 0;
                                                                /* リスニングソケットを作成 */
    listening_socket = socket(AF_INET,SOCK_STREAM,0);

                                                                /* ソケットオプション設定 */
    if ( setsockopt(listening_socket,SOL_SOCKET,SO_REUSEADDR,
                                    &sock_optval,sizeof(sock_optval)) == -1 ){
        perror("setsockopt");
        exit(1);
    }
                                                                /* アドレスファミリ・ポート番号・IPアドレス設定 */
    sin.sin_family = AF_INET;
    sin.sin_port = htons(port);
    sin.sin_addr.s_addr = htonl(INADDR_ANY);

    if ( bind(listening_socket,(struct sockaddr *)&sin,sizeof(sin)) < 0 ){
        perror("bind");
        exit(1);
    }

    if ( listen(listening_socket, SOMAXCONN) == -1 ){
        perror("listen");
        exit(1);
    }
    printf("ポート %d を見張ります。\n",port);

    waitval.tv_sec = 1;
    waitval.tv_usec = 0;

    FD_ZERO(&org_fd);
    FD_SET(listening_socket, &org_fd);
    max_sock = listening_socket;
        
    while (1){
        int i;
        struct hostent *peer_host;
        struct sockaddr_in peer_sin;

        memcpy(&fd, &org_fd, sizeof(org_fd));

        select(max_sock+1, &fd, NULL, NULL, &waitval);

        for ( i=0 ; i<=max_sock ; i++ ){
            if ( FD_ISSET(i, &fd) ){
                if ( i == listening_socket ){
                    int len;
                    len = sizeof sin;
                    max_sock++;
                    printf("connected_socket[%d]\n",max_sock);
                    connected_socket[max_sock] =
                        accept(listening_socket, (struct sockaddr *)&sin, &len);

                    if ( connected_socket[max_sock] == -1 ){
                        perror("accept failed.\n");
                    }
                        
                    len = sizeof(peer_sin);
                    getpeername(connected_socket[max_sock], (struct sockaddr *)&peer_sin,&len);
                        
                    peer_host = gethostbyaddr((char *)&peer_sin.sin_addr.s_addr,
                                                                        sizeof(peer_sin.sin_addr),AF_INET);
                        
                    printf("接続: %s [%s] ポート %d\n",
                                  peer_host->h_name,
                                  inet_ntoa(peer_sin.sin_addr),
                                  ntohs(peer_sin.sin_port)
                                  );
                    FD_SET(max_sock, &org_fd);

                } else {
                    int read_size;
                    read_size = read(connected_socket[i], buf, sizeof(buf)-1);
                    if ( read_size == 0 ){
                        printf("接続が切れました。引き続きポート %d を見張ります。\n",port);
                        close(connected_socket[i]);
                        FD_CLR(i, &org_fd);
                    } else {
                        printf("メッセージ: %s",buf);
                        write(connected_socket[i],buf,strlen(buf));
                    }
                }
            }
        }
    }
    close(listening_socket);
    return 0;
}

No. 1510 # E田 2001/01/05 (金) 16:07:43
もう、お返事を頂けたとは! すごいです。
ありがとうございます。
参考にして、勉強してみます。
それと、構造体に入れるところのプログラムを、そこのところだけ書きます。

テスト用に、こういう構造体を作りました。
struct test_s{
    u_long test_1;
    u_short test_2;
    u_short test_3;
    u_short test_4;
    u_short test_5;
};
struct test_s tes;

それから、読み込むところのプログラムです。

    while(1){
        int len;
        char *ptr;
        char buf1[256];

        len = read( newsockfd, buf1, sizeof( buf1 ));
        buf1[len] = '\0';
        if( len > 0 ){
            if( strncmp( buf1, "end", 3 ) == 0 ){
                break;
            }
            ptr = buf1;

            tes.test_1 = (int)ptr[0];
            tes.test_2 = (atoi)ptr[1];
            tes.test_3 = (atol)ptr[2];
            tes.test_4 = (int)ptr[3];
            tes.test_5 = (int)ptr[4];
        }
    }

こんな感じです。

test_2以降に入る予定のデータは、みんな同じのを送っていますけど、
どれも、変な感じになってしまいます。
(ここには書いていないですけど、printf()で表示させています。)
構造体とかポインタとか、意味は勉強したんですが、
書くのは初めてなので、そのせいかなとも思うんですが、
キャストのやり方が違うのかもしれません。
いろいろやっているうちに、自分ではわからなくなってしまいました。
ほんとうにすみませんけれども、教えてください。
お願いします。

No. 1511 # rosegarden 2001/01/06 (土) 00:15:40
>>E田
>キャストのやり方が違うのかもしれません。
確かにおかしな部分はあるようです。もっとも、それがどの程度
全体に影響を及ぼしているかは分かりません。参考程度と言うことで。
まず、次のようなサンプルプログラムを用意します。

#include <stdio.h>
#include <string.h>

struct test_s {
    unsigned long test1;
    unsigned short test2;
    unsigned short test3;
    unsigned short test4;
    unsigned short test5;
} tes_s;

int
main(int argc, char *argv[])
{
    char buff[256];
    char *ptr;

    buff[0] = '\x12'; buff[1] = '\x34'; buff[2] = '\x56'; buff[3] = '\x78';
    buff[4] = '\x0'; buff[5] = '\x1';
    buff[6] = '\x0'; buff[7] = '\x2';
    buff[8] = '\x0'; buff[9] = '\x3';
    buff[10] = '\x0'; buff[11] = '\x4';

    ptr = buff;
    tes_s.test1 = ((unsigned long *)ptr)[0];
    tes_s.test2 = ((unsigned short *)ptr)[1];
    tes_s.test3 = ((unsigned short *)ptr)[2];
    tes_s.test4 = ((unsigned short *)ptr)[3];
    tes_s.test5 = ((unsigned short *)ptr)[4];

    return 0;
}

なおキャストの仕方がE田さんのとは違いますが、
E田さんの意図を汲むのなら上の方がおそらく良いでしょう。

これをデバッガで検査してみました。最後の手前で break させて
変数を見ます。

(gdb) x/100bx ptr
0xbfbfd6f0: 0x12 0x34 0x56 0x78 0x00 0x01 0x00 0x02
0xbfbfd6f8: 0x00 0x03 0x00 0x04 0x44 0xd7 0xbf 0xbf

これを見る限りデータはちゃんとセットされています。

(gdb) p/x tes_s.test1
$1 = 0x78563412

最初の 4 バイトはひっくり返っています。もしも、動作させる予定の
計算機の CPU が little endian なら memcpy などを使って 1byte ずつ
コピーした方が無難です。ただし、SPARC とか m68k なら気にしなくて良い
場合もあります。(ただし、完璧に機種依存になるので、その旨コメントで
明記した方が良いでしょう。)

(gdb) p/x tes_s.test2
$2 = 0x7856
(gdb) p/x tes_s.test3
$3 = 0x100
(gdb) p/x tes_s.test4
$4 = 0x200
(gdb) p/x tes_s.test5
$5 = 0x0
(gdb) q

次からは、ずれていますね。例えば、tes_s.test2 = ((unsigned short*)ptr)[1]
というのは最初から、short が並んでいるとして、最初から 2 番目のものを
とりだすことになるので 配列先頭からの 3 バイト目と 4 バイト目をとりだ
します。更に、バイトオーダが絡んで来るので、話しは複雑になります。
機種に依存して良いのなら、

union hoge {
            struct some_struct {
              ....
            } hogehoge;
            char buff[256];
}

などとして一気にコピーする手法が典型的ですが、バイトオーダに悩まされま
す。これをすると SPARC では動くが intel 系の CPU では動かない、あるい
はその逆のプログラムになります。

まるで、馬鹿みたいに思えるかも知れませんが、memcpy で地道に値のコピー
を行った方が良いです。

繰り返しますが、これをなおしたとしても、
E田さんの問題の解決になるとは限りませんので、あらかじめおふくみおき下
さい。あくまでも気がついた範囲ではと言う話です。

No. 1512 # gixs 2001/01/06 (土) 01:05:05
>>1509 68user
68userさんはご存知かもしれませんが、他の人がはまらないように。
Linuxのselect(2)は、戻った時、第5引数の値が残り時間を示して戻ってくる(タイムアウトしたら値はゼロになる)ので、waitvalの値の設定はwhileループ内でやる必要があります(manにも書いてあります)。

> コピーした方が無難です。ただし、SPARC とか m68k なら気にしなくて良い
> 場合もあります。(ただし、完璧に機種依存になるので、その旨コメントで
> 明記した方が良いでしょう。)
教育的観点から言っても、やはり「常にネットワークバイトオーダに」でしょう。

> まるで、馬鹿みたいに思えるかも知れませんが、memcpy で地道に値のコピー
> を行った方が良いです。
バイトオーダと構造体のパディングを考えると、これしかありませんね。

参考
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.15

データ型をやりとりしたいなら、構造体ひとつに対し専用の読みだしと書き出しの関数を作るのが常套手段です。
(内部的には、構造体のメンバ変数をチマチマとネットワークバイトオーダにしながら、バッファにバイト列として書き出します。send側)。

もうひとつの手は(書かなかったら、68userさんが指摘するでしょうが)、数値でもなんでも文字列にしてしまう手です。
クライアント側のテストをスクリプト言語やtelnetを使って簡単にできるので、お薦めです(ただし、簡単すぎて卒業研究っぽくならないかもしれませんが)。

No. 1513 # CoreFighter 2001/01/06 (土) 02:11:36
68userさん MPSの件有難う御座いました。

ところで今疑問に思っている事があるのですが、
NICにはMACアドレスってのがありますよね。
モデムやTAにもMACアドレスってあるのでしょうか?

#ものすごい些細な質問で・・すんません。

No. 1514 # taka 2001/01/06 (土) 23:41:56
はじめまして
すいませんが質問です。
vi でヒアドキメントの使い方がわかりません
linuxで試しているのですが
ex/vi: Vi's standard input and output must be a terminal
とエラーになってしまいます。
できないのでしょうか?

No. 1515 # rosegarden 2001/01/07 (日) 00:08:35
>>1514 taka
> vi でヒアドキメントの使い方がわかりません

ex mode なら大丈夫なようです。ただし ex コマンド使わないと
いけませんが。そのまま vi mode で使う方法は分かりません。

#!/bin/sh

( vi -e | sed -e 's/^#/foo: /' ) << 'END'
a
hoge
hoge
hoge hoge
.
1,$s/^/#/
1,$p
q!
END

あとシングルクォートかエスケープ使った方が良いです。
最後の行の $ とシェル変数がバッティングしますから。

No. 1516 # taka 2001/01/07 (日) 01:05:59
有難うございます
以下のシェルで更新できました。

#!/bin/sh
vi -e data001 << 'END'
i
hoge
hoge
hoge hoge
.
wq!
END

ps
レスのつけ方がわかりませんでしたすいません

No. 1517 # 68user 2001/01/07 (日) 02:21:32
>>1510 E田
構造体の受け渡しに関しては、僕の出る幕はなさげですが、
一応まとめておきます。まず、E田さんはポインタの使い方を
学んで下さい。rosegarden さんのソースは
      tes_s.test1 = ((unsigned long *)ptr)[0];
      tes_s.test2 = ((unsigned short *)ptr)[1];
となっていますが、rosegarden さん自身が説明されている通り
これではまずいので
      tes_s.test1 = *(unsigned long *)(ptr);
      tes_s.test2 = *(unsigned short *)(ptr+4);
の方がいいでしょう。わからなければ再度質問してください。

で、それを理解してからやっとバイトオーダの話になります。これは
今回の件では関係ないかもしれない (エンディアンによってたまたま
問題が顕在化していないかもしれない) ので、参考程度にどうぞ。

以下のソースでは配列 data から変数 test1/2/3 に値を代入しようと
しています。

#include <stdio.h>
#include <string.h>

void
my_memcpy(char *dst, char *src, size_t len){
    src += len-1;
    while (len--) *dst++ = *src--;
}

main(){
    unsigned long test1;
    unsigned short test2;
    unsigned short test3;
    char data[] = {0x12,0x34,0x56,0x78,0x0,0x1,0x0,0x2};
    char *ptr = data;

    test1 = *(unsigned long *)(ptr);
    test2 = *(unsigned short *)(ptr+4);
    test3 = *(unsigned short *)(ptr+6);
    printf("普通に代入 0x%x 0x%x 0x%x\n", test1, test2, test3);

    memcpy(&test1, ptr+0, sizeof(test1));
    memcpy(&test2, ptr+4, sizeof(test2));
    memcpy(&test3, ptr+6, sizeof(test3));
    printf("memcpy 0x%x 0x%x 0x%x\n", test1, test2, test3);

    test1 = htonl(*(unsigned long *)(ptr));
    test2 = htons(*(unsigned short *)(ptr+4));
    test3 = htons(*(unsigned short *)(ptr+6));
    printf("hton して代入 0x%x 0x%x 0x%x\n", test1, test2, test3);

    my_memcpy(&test1, ptr+0, sizeof(test1));
    my_memcpy(&test2, ptr+4, sizeof(test2));
    my_memcpy(&test3, ptr+6, sizeof(test3));
    printf("逆順にmemcpy 0x%x 0x%x 0x%x\n", test1, test2, test3);
}

このサンプルでは
    char data[] = {0x12,0x34,0x56,0x78,0x0,0x1,0x0,0x2};
となっていますが、これを適当に切り取って変数に代入すると
順序が狂ってしまいます。実行結果は以下の通り。
    普通に代入 0x78563412 0x100 0x200 (間違い)
    memcpy 0x78563412 0x100 0x200 (間違い)
    hton して代入 0x12345678 0x1 0x2 (正しい)
    逆順にmemcpy 0x12345678 0x1 0x2 (正しい)
前の2つは順序が逆になっています。これはリトルエンディアンマシン
(x86 など) で発生します。ビッグエンディアン (68000, Sparc など)
では起こりません。

後の2つは htons/htonl や自作の my_memcpy でバイト順を置換して
代入しています (もちろん hton を使う方がよい)。

これはソケット経由でデータを送ると、バイト順が狂うという
意味ではありません。エンディアンが異なるマシン間でも、
データは送った順序で届きます。ですから、同じエンディアン
同士でデータを送りあえば問題は顕在化しません。

ただし、
    「異なるエンディアン間で変数の値を直接送信したとき」
は、
    「一方の CPU 内部ではバイト順の交換が行われるのに、
        他方では行われない」
ので、バイト順が狂ってしまいます。ですから、
    「事前にネットワークバイトオーダに変換してから送信」
し、
    「受信側はネットワークバイトオーダと認識して変数に代入する」
のが望ましいということです。

実際のソースで書くと、以下のような感じになります。

    送受信側でバイトオーダが一致していれば OK。異なるなら NG。
        (送信側)
        long send_num=0x12345678L;
        write(socket, &send_num, sizeof(send_num));
        (受信側)
        long recv_num;
        read(socket, &recv_num, sizeof(recv_num));

    バイト列をソケット経由で変数に代入する。受け手側が
    リトルエンディアンなら OK。そうでなければ NG。
        (送信側)
        char buf[]={0x12,0x34,0x56,0x78}; /* 0x12345687 を送りたいとする */
        write(socket, buf, sizeof(buf));
        (受信側)
        long recv_num;
        read(socket, &recv_num, sizeof(recv_num));

    ネットワークバイトオーダで送信。ネットワークバイトオーダを
    ホストバイトオーダにして代入。これが一番よい。
        (送信側)
        long send_num = htonl(0x12345678L);
        write(socket, &send_num, sizeof(send_num));
        (受信側)
        long recv_num;
        char buf[256];
        read(socket, buf, sizeof(recv_num));
        recv_num = ntohl(*(long *)(buf));

なお、ネットワークバイトオーダ=ビッグエンディアンのオーダです。
別に両者で合意が取れていればいいので、リトルエンディアンで
統一したければそれはそれで構いません。

ちなみに X プロトコルでは高速化のため、事前にクライアント・サーバ
間でバイトオーダが異なるかどうかチェックして、
    - 同じバイトオーダならそのままデータを送る
    - 異なるバイトオーダならネットワークバイトオーダに変換してから送る
となっているとか。

ところで
    my_memcpy(void *dst, void *src, size_t len){
とすると gcc に invalid use of void expression と怒られるんですが、
引数を void * で受けるのってできないんでしたっけ?

>>1512 gixs
> Linuxのselect(2)は、戻った時、第5引数の値が残り時間を示して戻ってくる
> (タイムアウトしたら値はゼロになる) ので、waitvalの値の設定はwhile
> ループ内でやる必要があります(manにも書いてあります)。
ご指摘どうもです。その通りですね。ちなみに FreeBSD では
select(2) の BUGS の項で、本来上記のような動作をするべきだが、
現状ではそうなっていない (waitval の値は書き換えられない) と
あります。

>>1513 CoreFighter
> NICにはMACアドレスってのがありますよね。
> モデムやTAにもMACアドレスってあるのでしょうか?
ないです。なぜかっちゅうと NIC は Ethernet の端点だからです。
# なぜ Ethernet だと MAC アドレスが必要で、モデム/TA に
# MAC アドレスが必要ないか…は、うまく説明できないなぁ。
# 誰か教えて下さい。

No. 1518 # taka 2001/01/07 (日) 14:58:23
すいませんがまた質問です。
今度はftp でヒアドキメントの使い方がわかりません
ftp ftp.xxx.xxx.ne.jp << EOF
userid
password
by
EOF
これで実行すると
Password:Name(ftp.xxx.xxx.ne.jp:root):
と聞かれてしまいます。
シェルだけで実行する方法はありませんか?

No. 1519 # 68user 2001/01/07 (日) 17:43:41
>>1518 taka
> 今度はftp でヒアドキメントの使い方がわかりません
http://X68000.startshop.co.jp/~68user/unix/pickup?ftp
の -n オプションの説明を見て下さい (Linux で使えるかどうかは
わかりませんが)。

No. 1520 # rosegarden 2001/01/07 (日) 22:00:02
>>1487 68user
先日の FreeBSD の crypt(3) のデフォルトについてですが、
暮れから新年にかけてライブラリ関数のレベルで切り替えの
メカニズムが commit されたようです。いまとのところ
5-current でしか使えず、管理権限がないと切り替えられないのですが。
/etc/auth.conf に crypt_default=md5 という設定を入れると perl の
crypt もデフォルトが md5 になるようです。

# 今日 CVSup でソースとって来た人は 20 時以降のソースとって来た方が
# いいです。昼のソースだと pccard 周りのコンパイルが出来ません。
# 今はなおっていますが。

No. 1521 # 68user 2001/01/08 (月) 03:02:15
せっかくなので、
>>1509 68user
のソースを書き直して
    「C 言語で echo サーバを作ってみよう (2)」
    http://X68000.startshop.co.jp/~68user/net/c-echo-2.html
を作ってみました。C言語+select によるタイムアウト機能付き echo サーバです。
# 一応バグは潰したつもり。

あと、これまでご指摘を頂いた
>>1389 Yuuki
の accept のバグ、
>>1215 UNIX見習い
>>1216 68user
の LocalAddr のバグを修正しました。お二人に感謝。

No. 1522 # 68user 2001/01/08 (月) 14:58:03
>>1520 rosegarden
おろ、/etc/login.conf には passwd_format=md5 で、/etc/auth.conf には
crypt_default = md5 des で、libutil で、libcrypt ですか。全然なにが
なんだかわかってませんが、手元にソースがないので調べにくい。MFC を待つか…。

# 軟弱なので、うちは今朝の 4-STABLE です。

No. 1523 # rosegarden 2001/01/08 (月) 20:08:16
>>1522 68user
言葉が足りないようですみません。
4-stable では /etc/login.conf に passwd_format=md5 と明示的に
指定することによって passwd コマンドなどで
使用するハッシュ関数は変更できますが、perl などで使用している
crypt(3) などのハッシュ関数はそのまま des だったりします。
解禁以降、大抵の人はそのまま des 入れているでしょうから。
一方、5-current だと /etc/login.conf でのハッシュ関数の
指定は passwd コマンドでは有効になりますが、それとは別に crypt(3)
のハッシュ関数を /etc/auth.conf で指定できます。
これはさっき CVSup して確かめましたが、4-stable には反映されていません。
http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/lib/libcrypt/crypt.c
ソースはここで確かめられます。
CGI で差分も見れます。

> # 軟弱なので、うちは今朝の 4-STABLE です。
いや、あまり関係ないかと思います。去年の暮れに 4-stable が page fault 頻発して
放棄せざるを得ない状態まで追い込まれたことあります。結局
kernel panic 起こしながら、数個ずつ kernel のファイルをコンパイルして、
安定した kernel をインストールし、それで回復させましたが。
同じ時期の 5-current はすごく安定していました。
ハード構成いかんではそういうことも起こり得ます。

No. 1524 # みかん 2001/01/08 (月) 22:48:59
初めまして。
FreeBSD 3.5.1と、それに付属のperlを使っています。
そこでソケットに関するプログラムを組みましたが、ちょっと問題が出てきました。
下記のソースを見てください。
HTTPサーバに接続して、メッセージを受け取り、一定時間何も受信できないと
プログラムを終了しようとしています。
(本当は、相手のサーバからコネクションを切られたら終了するようにしたいんです。)

サーバと接続されいる状態では、selectは期待した値を戻してくれるのですが、
接続が切断されたあとも、selectの戻り値が 0以外で、いつまでたっても、
ループから抜けられません。
なにか解決方法はないでしょうか?

(大抵のサンプルはwhile (<SOCK>) って感じでやってるみたいですが、
    バイナリファイルが対象でもうまくいくのでしょうか?)

## ソケットを開いて、ポート80)に繋ぐ。 ##
send(SOCK,"GET /index.html HTTP1.0\r\n",0);
$rin='';
vec($rin,fileno(SOCK),1)=1;
while (1) {
    $ret = select($rout=$rin,undef,undef,1);
    if ($ret == 0 ) { last; } #タイムアウト
    recv(SOCK,$x,1,0);
    print $x;
}

No. 1525 # 68user 2001/01/08 (月) 22:58:40
>>1524 みかん
ちろっと見た感じでは
    1. \r\n が一個足りません。
    2. 相手側がコネクションを切断したときも select は 1 を返します。
          その際、recv すると1バイトも読めず、0を返しているはずなのに
          無視しているので永遠に終わらないのです。

# http://X68000.startshop.co.jp/~68user/net/echo-4.html

No. 1526 # 68user 2001/01/08 (月) 23:25:51
>>1523 rosegarden
> 言葉が足りないようですみません。
いや、解説を催促するつもりはなかったのですが、恐縮です。
login.conf ということはユーザごとに DES か MD5 を定義
できて、しかも各ユーザは ~/.login_conf で上書き自由、
ということだと思うんですが、それが出来て何がうれしい
んだろう…ってのが疑問なんです。

# NIS 使用時に幸せ?

> 去年の暮れに 4-stable が page fault 頻発して
> 放棄せざるを得ない状態まで追い込まれたことあります。
恐いですねぇ。僕は FreeBSD-stable も流し読みだし、make world で
こけたとき直すスキルもないので、ビクビクしながらやってます。
4-STABLE じゃなくて 4.2-RELEASE にしとけばよかったな。

>>1524 みかん
> 大抵のサンプルはwhile (<SOCK>) って感じでやってるみたいですが、
> バイナリファイルが対象でもうまくいくのでしょうか?
<> は C でいうところの fgets 相当 (+バッファサイズが無限長) なので
うまくいきます。

うまくいきますが、改行コードが1つもないデータを読もうとすると
一度に多くのバッファ (=メモリ) を消費するので、
    sysread(SOCK, $buf, 8192);
    read(SOCK, $buf, 8192);
    while ( read(SOCK, $buf, 8192) ){ print $buf }
などの方がよいです。

ついでに言っておくと、状況にもよりますが、select に
<> や read を使うのは不適切です。select で読み込み
可能だからといって、「改行コードを含むデータ」や
「指定したサイズのデータ」が読み込めるとは限らない
ので (データの前半部分だけが先に到着しているかも
しれない) からです。せっかく select でブロッキングを
回避しているのに、<> や read の部分でブロッキング
してしまうかもしれない。

# ここでいう read は read(2) でなく perl の read (fread(3)) です。

No. 1527 # gixs 2001/01/08 (月) 23:45:36
>>1517 68user
> ところで
> my_memcpy(void *dst, void *src, size_t len){
> とすると gcc に invalid use of void expression と怒られるんですが、
> 引数を void * で受けるのってできないんでしたっけ?

おや?
68userさんにしては珍しい。
# まあ、プログラミング言語って(自然言語も同じようなものですが)、
# ちょっと離れるだけで勘がにぶって、ポカをやらかしてしまいますが。

そのエラーは、引数で受けた部分ではなく、
dst++などの演算のところのエラーですね。

逆に、char*で受けた場合、gcc -Wallのwarningを黙らすために、
(char*)&test1のようなキャストが必要です。
# gccはいつも-Wall。これでポカミスを結構見付けられます。

No. 1528 # rosegarden 2001/01/09 (火) 02:27:54
>>1526 68user
> それが出来て何がうれしい
うーん、それはそうですね。ただ、人によってこだわりは
あるでしょうから。本当の理由は私も良く分かりませんが、
des インストールしても md5 で crypt できるのはやはり
嬉しいです。

No. 1529 # 68user 2001/01/09 (火) 06:52:37
>>1527 gixs
> そのエラーは、引数で受けた部分ではなく、
> dst++などの演算のところのエラーですね
なるほどなるほど。
    void
    my_memcpy(void *dst, char *src, size_t len){
        (char *)src += len-1;
        while (len--){
            *((char *)dst)++ = *((char *)src)--;
        }
    }
てな感じでしょうか。

> おや? 68userさんにしては珍しい。
僕は元々ヘボです。-Wall は付けてますが、いつも warning が出る
ものの、キャストの仕方がわからず、大抵「まぁ動いているからいいや」で
済ましてしまうレベル (^^;

>>1528 rosegarden
> des インストールしても md5 で crypt できるのはやはり
> 嬉しいです。
ちと考えてみましたが、例えば apache+suExec で CGI を動かす
とき、「俺は前の環境で作成したパスワードがあるので DES」
とか「私はセキュリティ重視で MD5」などと、ユーザごとに
DES/MD5 を選べたりする、ってな場合があるかもしれませんね。


全然関係ありませんが、掲示板の使い方
    http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse
を作りました。上の [使い方] から飛べます。

No. 1530 # みかん 2001/01/09 (火) 17:21:00
こんにちは、UNIX1年生のみかんと申します。

文字列置換のsedコマンドを使って変数の中の文字列を置換して
別の変数に入れたいと考えております。このようなことは可能でしょうか?

sed -e "s/aaa/bbb/g" ${ABC}

ここで変数${ABC} の中に入っている値(例えばaaa)を置換して
変数${CBA}に挿入したいと考えております。

大変に恐縮ですが、ご存知の方がいらっしゃいましたらご教授いただけませんでしょうか。よろしくお願いします。

No. 1531 # hsj 2001/01/09 (火) 19:12:07
>>1505 inpaku
あー、もう解決してらっしゃるかもしれませんが、
だいぶ前にこう言うものをつくりました。
http://www.geocities.co.jp/MotorCity/5319/deception_doc.txt
http://www.geocities.co.jp/MotorCity/5319/deception.txt
暇つぶしにつくった趣味のソースなんで、ぼく自身が忘れないための
やる気のないコメントしか入ってません(苦笑

自ホストのNICからMACアドレスを引っぱってきてるのは、
gethwaddr()関数のあたりです。

あて先ホストのMACはlookup_mac()関数で持ってきてます。
ARPリクエストを流してから、自分のNICにキャッシュされたか
確認することで取得しています。

今見ると、ところどころマヌケできったないソースですが
参考になれば。

No. 1532 # E田 2001/01/10 (水) 10:09:38
68userさん、rosegardenさん、gixsさん、
回答、ありがとうございます。
今から、読みながら、また勉強します。
本当に、ありがとうございました。
やってみて、また、わからなかったら質問すると思いますが、
また、よろしくお願いします。

No. 1533 # とも 2001/01/10 (水) 15:40:30
はじめまして.
IPアドレスとポート番号で,サーバーとそこで動いているサーバープログラムが特定できる所までは理解できました.
では,あるマシンで2つWWWブラウザーを立ち上げて,その両方とも同じHTTPサーバーにアクセスした場合,サーバはどちらのブラウザーにHTMLを送り返すか分からないと思うのですが,それはどうやって識別しているのでしょうか.

No. 1534 # 68user 2001/01/10 (水) 16:07:07
>>1530 みかん
> こんにちは、UNIX1年生のみかんと申します。

>>1524 みかん
の方とは別の方ですか?

sh・bash なら
    CBA=`echo $ABC | sed 's/aaa/bbb/g'`
csh・tcsh なら
    set CBA=`echo $ABC | sed 's/aaa/bbb/g'`
    set CBA=$ABC:s/aaa/bbb/g (これって SunOS の csh でも使えるのか〜)
てな感じでしょうか。他にも方法があると思いますが、
僕はこれだけしか知りません。

>>1533 とも
> では,あるマシンで2つWWWブラウザーを立ち上げて,その両方とも
> 同じHTTPサーバーにアクセスした場合
2つのブラウザは、それぞれソケットを生成しますが、それぞれ
同じサーバに connect したとき、自動的に OS が選んだポート
番号が割り振られますので、それで識別できます。

ブラウザが1つであっても、HTML とその中に貼られている画像を
平行して読み出すときなどはソケットを複数使いますが、これも
別のポート番号が割り当てられます。

クライアントは、getsockname すれば自分に割り当てられた
ポート番号がわかりますし、サーバからは getpeername
すればクライアント側のポート番号がわかります。

ちなみに IP データグラムのヘッダには始点 IP アドレス、
始点ポート番号、終点 IP アドレス、終点ポート番号が
記録されています。

No. 1535 # みかん(一年生) 2001/01/10 (水) 17:22:50
>No. 1534 68user

68userさん、ご教授ありがとうございます!

>>>1524 みかん
>の方とは別の方ですか?

いいえ、みかんという方が他にもいらっしゃったんですね。
これからはみかん(一年生)と名乗ることにします。

68userさんのご教授いただいた内容にて、問題が解決いたしました。
非常に感謝しております。ありがとうございました。

今後ともよろしくお願いいたします。 ・・・質問ばかりしていてはだめだとは思っているのですが(>_<)

No. 1536 # ゆきえ 2001/01/10 (水) 21:25:29
初めて書き込みします。
質問なのですが、ローカルマシンからリモートマシンへコピー(移送)した場合、コピーしたファイルやディレクトリのユーザーID/グループIDがその時の実行ユーザーID/グループIDに変わってしまいます。
これをそのままの設定のままコピーする事はできないでしょうか?
ちなみにrcpとftp(ディレクトリのコピー(移送)自体が既に無理)では無理でした。
出来ればUNIXコマンドかPerlで可能な方法があれば教えて下さい。
これらでは無理でも他の方法でなら可能だと言うご意見でも構いませんので、よろしくお願いします。
使用環境:solaris8
使用言語:Perl5.0、csh

No. 1537 # 68user 2001/01/10 (水) 22:39:18
>>1534 68user
> sh・bash なら
>  CBA=`echo $ABC | sed 's/aaa/bbb/g'`
sh・bash で他の方法があったら教えてください。

>>1536 ゆきえ
> ユーザーID/グループIDがその時の実行ユーザーID/グループIDに
> 変わってしまいます。
というのが既に誤解ではないかと思います。
    % rcp ~/a.txt userA@host:~/b.txt … host:~userA/b.txt のオーナーは userA
    % rcp ~/a.txt userB@host:~/b.txt … host:~userB/b.txt のオーナーは userB
となります。

ですから、ファイルのオーナー/グループが誰になるかは
    「その時の実行ユーザID/グループID」
で決まるのでなく、
    「rcp するとき どのユーザで認証を行うか」
によります。ftp も同じで、ログイン時にどのユーザ名で
認証を行うかで決まります。

No. 1538 # ゆきえ 2001/01/11 (木) 09:31:50
お答えありがとうございます。

>「rcp するとき どのユーザで認証を行うか」
ですと、認証したユーザーに結局は変更されてしまいますよね?
ディレクトリの配下には色々なユーザーIDやグループIDが存在していますのでそれを変更したくはないのです。
調べていますとfilename.tar.zをrcpで移送して、rshでuncompress、tar -xvfpをすろ事でこの問題が回避されそうなのですが、tar -xvfpがうまくいきません。
マシンAのルートディレクトリにある./usr.tarをマシンBからrshで
rsh A tar xvfp ./usr.tar
rsh A tar xvfp ./usr.tar ./.
rsh A tar xvfp ./usr.tar -C ./.
いずれの場合も展開されませんでした。
どうすればtarファイルを展開できるのでしょうか?

No. 1539 # rosegarden 2001/01/11 (木) 10:10:47
>>1538 ゆきえ
> tar -xvfpがうまくいきません
f の直後に tar ファイル名を指定しないといけません。
だから、いつも f は最後と覚えてください。

tar -xvpf hogehoge.tar

No. 1540 # 68user 2001/01/11 (木) 10:14:16
>>1538 ゆきえ
> ディレクトリの配下には色々なユーザーIDやグループIDが
> 存在していますのでそれを変更したくはないのです。
ああ、なるほど。理解しました。

1. ファイルのオーナーを調べ、その権限で rcp する
    foreach file (*)
        set owner=`ls -l $file | awk '{print $3}'`
        rcp $file ${owner}@host:~
    end

2. root で tar xvfp する。
    ただし、展開時のファイルのオーナーは、ユーザ名でなく uid に
    従うので、ローカルとリモートの uid の割り振り (/etc/passwd) が
    同じである必要がある。

てなところですか。

> マシンAのルートディレクトリにある./usr.tarをマシンBからrshで
> rsh A tar xvfp ./usr.tar
rsh の前に マシンA に rcp で usr.tar をコピーしましたか?

>>1539 rosegarden
> f の直後に tar ファイル名を指定しないといけません。
今回は問題ないんじゃないですかね。x,v,p とも引数を取らないので。

No. 1541 # 68user 2001/01/11 (木) 10:26:34
>>1540 68user
>> マシンAのルートディレクトリにある./usr.tarをマシンBからrshで
>> rsh A tar xvfp ./usr.tar
> rsh の前に マシンA に rcp で usr.tar をコピーしましたか?
ああ失礼、マシンAにファイルはあるのね。で、「ルート
ディレクトリ」は「ホームディレクトリ」の間違いですか?
    % rsh A tar xvfp ./usr.tar
だと、~/usr.tar を読みにいってしまいますので。
# root 権限でやってるならルートディレクトリでいいのかも。

No. 1542 # [E-mail] 2001/01/11 (木) 11:07:40
初めて書き込みします。
質問なのですが、DBの接続はDBIで行っています。使用言語はPERLです。
DBへの接続は通常DBIの場合、connectにより行っていますが、
現時点でconnectがされているか、されていないかをコーディング上で
確認する方法はありますでしょうか?
ご存知の方がいらっしゃいましたらご回答のほうをお願いします。

No. 1543 # 68user 2001/01/11 (木) 11:11:39
>>1542
> 現時点でconnectがされているか、されていないかを
> コーディング上で確認する方法はありますでしょうか?
ping ちうのがありますね。$rc = $dbh->ping;

No. 1544 # 68user 2001/01/11 (木) 11:14:56
>>1538 ゆきえ
断りなしにマルチポストする人は、うちの掲示板に
書き込まないで下さい。
    http://www.parkcity.ne.jp/~chaichan/qanda/qa539.htm?01-01-11-10-57
今後は向こうでどうぞ。

No. 1545 # rosegarden 2001/01/11 (木) 12:15:39
>>1540 68user
> > f の直後に tar ファイル名を指定しないといけません。
> 今回は問題ないんじゃないですかね。x,v,p とも引数を取らないので。
はずかしながら今まで、知りませんでした。
御指摘ありがとうございます。

No. 1546 # rosegarden 2001/01/11 (木) 12:28:26
> > > f の直後に tar ファイル名を指定しないといけません。
> > 今回は問題ないんじゃないですかね。x,v,p とも引数を取らないので。
> はずかしながら今まで、知りませんでした。
たびたびすみません。知らなかったのは事実なのですが、GNU tar だと
ハイフン付けて tar するとだめみたいです。
GNU tar 1.13 の場合
% tar -xvfp hoge.tar
tar: Cannot open p: ファイルもディレクトリもありません。
tar: Error is not recoverable: exiting now
一方、Solaris の /bin/tar は 68user さんのおっしゃるとおり
関係なくファイルを取り出せます。これも知りませんでした。

No. 1547 # 2001/01/11 (木) 13:40:02
>>1543 68user
>> 現時点でconnectがされているか、されていないかを
>> コーディング上で確認する方法はありますでしょうか?
> ping ちうのがありますね。$rc = $dbh->ping;
ご回答ありがとうございます。
実際に試してみたんですが、disconnectされている状態で
$rc = $dbh->ping;を実行すると以下のようなエラーが出力されました。

DBD::Oracle::db ping failed: ERROR Database disconnected at ****.pl line ****.
For help, please send mail to this site's webmaster, giving this error message and the time and date of the error.
  
続けて処理をすることはできないのでしょうか?
それとも根本的に何かが違うのでしょうか?
よろしくお願いします。

No. 1548 # 2001/01/11 (木) 13:48:09
>>1543 68user
>> 現時点でconnectがされているか、されていないかを
>> コーディング上で確認する方法はありますでしょうか?
> ping ちうのがありますね。$rc = $dbh->ping;
ご回答ありがとうございます。
実際に試してみたんですが、disconnectされている状態で
$rc = $dbh->ping;を実行すると以下のようなエラーが出力されました。

DBD::Oracle::db ping failed: ERROR Database disconnected at ****.pl line ****.
For help, please send mail to this site's webmaster, giving this error message and the time and date of the error.
  
続けて処理をすることはできないのでしょうか?
それとも根本的に何かが違うのでしょうか?
よろしくお願いします。

No. 1549 # 2001/01/11 (木) 14:03:22
同じ内容を2度送信してしまいました。
どうもすみません。

No. 1550 # 68user 2001/01/11 (木) 14:48:12
>>1546 rosegarden
> % tar -xvfp hoge.tar
> tar: Cannot open p: ファイルもディレクトリもありません。
なるほど。tar -x -v -f p hoge.tar と同じ扱いになるわけですね。
いつも - を付けないので知りませんでした。

>>1547
うーん、SunOS5.6 + perl-5.004_04 + DBD-Oracle-1.06 + Oracle8.0.5.0.0(?) では
    use DBI;
    $o_DB = DBI->connect("dbi:Oracle:", "username", "passwd")
        or die "connect error";
    $o_DB->{RaiseError} = 0;
    $o_DB->disconnect;

    if ( $o_DB->ping ){
        print "connect!\n";
    } else {
        print "not connect!\n";
    }
で、not connect! と表示されました。標準エラー出力には
    DBD::Oracle::db ping failed: ERROR Database disconnected at a line 7.
と表示されますが、その後も処理は続けることができました。

> 同じ内容を2度送信してしまいました。
> どうもすみません。
いえいえ。

おそらくどこかのロボットが がんがんアクセスしているので、
OS の最大数以上のディスクリプタを開こうとして OS や apache や
perl がこけまくってるようです (だからサーバエラーが頻発している)。

普通は二度書きチェックを行っていますが、ちょうど二度書き
チェック用ファイルのオープンに失敗したくさいですね。

No. 1551 # 2001/01/11 (木) 16:35:02
>>1547 68user
回答ありがとうございます。
私もif文で確かめてみましたが、not connect! と表示されず、
処理が途中で止まってしまいました。
やはり、記述の通り環境の問題があると思われます。
ただ、確認の方法が分かったので助かりました。
ありがとうございました。

No. 1552 # 68user 2001/01/11 (木) 19:44:31
>>1551
> 私もif文で確かめてみましたが、not connect! と表示されず、
> 処理が途中で止まってしまいました。
なるほど。うちの環境では、他のエラーは全てトラップできるのに、
ブレースホルダ `?' の数より多く bind_columns すると、エラーと
なって perl が終了してしまうという問題があります。

perl や DBI/DBD のバージョンによっては、ping も同様に
トラップできないエラーを発生することがあるのかも
しれませんね。

# perl+DBI 暦は3ヶ月程度なので、全体的によくわかってません。
## が、Pro*C や PL/SQL より100倍使いやすいということは
## よく理解できました。

No. 1553 # CoreFighter 2001/01/12 (金) 20:37:33
apacheのlogを見ていたのですが、
ほとんどのlogがGETやPOSTの中で
192.168.1.1 - - [11/Jan/2001:04:27:16 +0900] "HEAD / HTTP/1.0" 403 0
っていうlogがありました。
このHEADってなんでしょうか?

No. 1554 # ぽよぞー 2001/01/13 (土) 00:25:18
はじめまて。

http://x68000.startshop.co.jp/

これ、かっこいいんですけど・・・・
.htaccessでできるんですか?
よかったらやりかた教えてください・・・

No. 1556 # has 2001/01/13 (土) 00:56:07
No. 1555は参照元のページの著作権のルールにのっとって
いなかったようなので、もう一度書き込みます。

# 1555は消しておいて下さい>68user

>>1553 CoreFighter
HEADはその名の通り、

HTTP/1.1 200 OK
Date: Fri, 12 Jan 2001 15:34:47 GMT
Server: Apache/1.3.12 (Unix) mod_ssl/2.6.5 OpenSSL/0.9.5a
Last-Modified: Wed, 12 Apr 2000 09:18:00 GMT
ETag: "a7f83-3e0-38f43f48"
Accept-Ranges: bytes
Content-Length: 992
Connection: close
Content-Type: text/html

など、HTTPのヘッダ情報だけを返すMETHODのようです。

参照元:丸山不二夫著「WWWサーバー管理」(稚内北星ビブリオン内)
http://www.wakhok.ac.jp/~maruyama/W3serv/document/node95.html

# wakhokは講義テキストを公開しているそうで、参考になります

No. 1557 # 68user 2001/01/13 (土) 02:30:10
>>1554 ぽよぞー
> http://x68000.startshop.co.jp/
> これ、かっこいいんですけど・・・・
> .htaccessでできるんですか?
無償でこのサーバを提供していただいている Netboy さんが
作成されたものをそのまま使っています。apache のデフォルト設定では
    - HEADER というファイルに書いたものは、ディレクトリ一覧の先頭に表示される
    - README というファイルに書いたものは、ディレクトリ一覧の最後に表示される
で、さらに
    - HEADER, README だとプレインテキスト扱いで、(< > & が置換される)
    - HEADER.html、README.html だと HTML 扱い (< > & はそのまま出力)
という扱いがされます。というわけで、
    http://X68000.startshop.co.jp/~68user/tmp/HEADER.html
    http://X68000.startshop.co.jp/~68user/tmp/README.html
てな感じのものを置いとけばいいです。細かなカスタマイズは IndexIgnore、
IndexOptions、IndexOrderDefault で。詳しくはこちらをどうぞ。
    http://httpd.apache.org/docs/mod/mod_autoindex.html

>>1556 has
> # 1555は消しておいて下さい>68user
へい、消しました。

>>1553 CoreFighter
> このHEADってなんでしょうか?
質問する前に、一通り眺めてくれるとうれしいです。
    http://X68000.startshop.co.jp/~68user/net/http-3.html#5

No. 1558 # 68user 2001/01/13 (土) 04:51:37
>>1430 68user
> おお、化けてる。
    - s|^( +)|'&nbsp;&nbsp;' x length($1)|e;
    + s|^(( )+)|'&nbsp;&nbsp;' x length($1)|e;
というバグが原因でした。

No. 1559 # 403 2001/01/13 (土) 11:54:07
通りすがってみました。(意味不明)

@HEAD
こういう奴もあったりする。

telnet www.yahoo.com 80
Trying 204.71.200.68...
Connected to www.yahoo.akadns.net.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.0 200 OK
Content-Length: 15629
Content-Type: text/html

<html><head><title>Yahoo!</title>
以下略

No. 1560 # debra [E-mail] 2001/01/13 (土) 12:13:56
はじめまして。ちょっとわからなくてききたいのですが・・・。
crontabに登録しようとしているのですがうまくいきません。
10 * * * * /home/〜(実行形式ファイルのフルパス)
と登録したところ、
>UX:crontab:警告:コマンドは /usr/bin/sh で実行されます.
というメッセージが出てきてしまいます。
どうしたらよいのでしょうか?

No. 1561 # rosegarden 2001/01/13 (土) 15:49:52
>>1560 debra
> >UX:crontab:警告:コマンドは /usr/bin/sh で実行されます.
> というメッセージが出てきてしまいます。
SHELL=/bin/sh とかいれてもだめですか?
/usr/bin/sh なんていう sh をもつシステムが思い当たらないので、
詳しいこと言えませんが。
man 5 crontab (*BSD, Linux)
あるいは
man -s 5 crontab (Solaris の場合)
すると書き方が大抵の場合かいてあります。
あるいは man crontab して SEE ALSO を見るとセクション番号が
分かるはずです。

No. 1562 # rosegarden 2001/01/13 (土) 15:52:34
4-stable のビルドしてますが、 make release の最中にまた
page fault 起こしました。make world しなきゃよかった。:-<
今回のは悪質で、backtrace がとれないです。
まあ、page fault なんで、もはや素人の出られる幕はありませんが。
% uname -v
FreeBSD 4.2-STABLE #0: Fri Jan 12 21:43:37 JST 2001
一回だけなので、年末のよりはましですが、私の環境で安定していたのは
FreeBSD 4.2-STABLE #0: Tue Jan 9 00:25:52 JST 2001
の奴ですね。これは、ちょうど、この前 68user さんが make world した
前後のと kernel はそんなに変わらないとおもいます。
当分の間 4-stable の make world は見合わせた方がいいです。

それから g++ も不安定ですね。ランダムに compiler internal error
が出ます。top コマンド見ているとメモリが少なくなった状況で
このエラーが出るようです。だから、libstdc++ とか groff の make
でこけることが多いです。しかも、失敗してから、もう一度 make
すると通ることもあるので、嫌になってきます。

次に多いのが、perl の library の make の失敗。これは原因がかなり
はっきりしていて、make world 始める前に /usr/obj 消しておくと
出食わしません。

# 三月に 4.3-RELEASE でるんだろうか?
# どうも 4.1-RELEASE よりは不安定になっている様な気がする。
# -current の方がよほど安定しているし ;-<

No. 1563 # yoshi [E-mail] 2001/01/14 (日) 16:11:26
お世話様です。
perl に ついてお伺いしたいのですが何方かご存知でしたら教えてください。
文字置換で下記のような物を実行するとエラー(ドキュメントにデータが無い)
とエラーが出て動作しません。どうも”ー”のキャラクターが原因のようです。
kk,mmの変数でtest変数文章を部分変換したいのですがココでつまずいています。

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
$test = "ホームページの更新";
$kk = "ホームページ";
$mm = "掲示板";
$test =~ s/$kk/$mm/;
print $test;
-----------------------eof-------------------------

No. 1564 # 68user 2001/01/14 (日) 17:27:13
>>1562 rosegarden
最近の stable では、thread まわりのバグが fix されて、
mozilla5 が動くようになったそうですが、cvsup するのは
やめときます (笑)

>>1560 debra
>UX:crontab:警告:コマンドは /usr/bin/sh で実行されます.
「警告」っつーのが謎ですね。動作には影響ない?

>>1563 yoshi
CGI 経由でデバッグするのはやめましょう。まずはコマンドライン
からです。さすれば
    /z[y[W/: unmatched [] in regexp at a line 6.

    /ホームページ/: unmatched [] in regexp at a line 6.
というエラーが表示されることが確認できるでしょう。

というわけで「ホームページ」という文字列をダンプすると
    203 z 201 [ 203 200 203 y 201 [ 203
となります。「ー」の2バイト目が `[' と同じコードのため、
[] が正規表現として正しくない (']' で閉じていない) ということです。
対処法としては
    1. SJIS を使わない。スクリプトの文字コードを EUC にする。
    2. jperl を使う http://www.jp.FreeBSD.ORG/QandA/HTML/1218.html
です。他にも \Q〜\E で囲むだとか、quotemeta を使うなどの手は
ありますが、所詮小細工のレベルです。根本的には上のいずれかを
選びましょう。

No. 1565 # けんす 2001/01/15 (月) 00:55:54
ぽよぞーです。
さっそくやってみたのですが、、

http://www.kensu.com/zzztest/

できないっす、、なぜだ、、
HEADER.html、README.html置いてあるのに、
一覧には表示されてないし、、。(直指定で見れまぷ)
原因おわかりでしたらご教授くださいませ・・・

No. 1566 # けんす 2001/01/15 (月) 01:02:44
あ、すんません、追加で。
もしできたとして、
全部のディレクトリにこれ反映させるにはどうしたらいいですか??
mod_rewrite入ってるみたいなのでそれでできますか??
よろしくどうもー。

No. 1567 # yoshi 2001/01/15 (月) 01:18:41
>>1564 68user
スクリプトの文字コードを EUCにします。ありがとうございました

No. 1568 # けんす 2001/01/15 (月) 02:42:26
いろいろやってたら解決できました!

HeaderName /lib/HEADER.html
ReadmeName /lib/README.html

<FilesMatch "^(HEADER|README)\.html$">
        ForceType text/html
</FilesMatch>

http://www.kensu.com/.htaccess

強制的にtext/htmlにしたらうまくいきました。

全部のディレクトリに反映させるのも、上のとおり
ディレクトリも含めて指定したらすんなりできました。

img/,doc/など掘ってありますので見てみてください。

http://www.kensu.com/img/

何度も投稿して板汚してすんません、、>68userさん
ではでは

No. 1569 # 68user 2001/01/15 (月) 05:44:18
>>1568 けんす
> <FilesMatch "^(HEADER|README)\.html$">
> ForceType text/html
> </FilesMatch>
これは多分デフォルトで設定されていると思います (というか、
.html だから text/html になっているんじゃないかなぁ)。

> HeaderName /lib/HEADER.html
> ReadmeName /lib/README.html
書いてませんでしたが、HEADER/README は、一覧表示させたい
ディレクトリに置いて下さい。もちろん HEADER/README を
一ヶ所に集めたいなら今の設定で OK です。もしかして
> HEADER.html、README.html置いてあるのに、
同じディレクトリに置いてもダメでしたか?

あと質問なんですが、www.kensu.com の
    Server: Apache/1.3.12 (Unix) OCTO_3.0 PHP/4.0.0 FrontPage/4.0.4.3
OCTO って何ですか?

No. 1570 # E田 2001/01/15 (月) 18:55:05
すみません。
また教えて欲しいのですが、これは、Cの質問だと思うのですが、
もしかすると、関数自体が間違っているのかもしれないので、
どうか、教えてください。

下記のような関数を使いたいのです。
int write_sock( int sockfd, char *str )
{
        int write_len = 0;
        int count = 0;
        size_t bytes_sent = 0;
        char *buf;
        char str_buff[1024];

        sprintf( str_buff, "\r%s", str );
        count = strlen( str_buff );
        if( count <= 0 ){
        return( NG );
    }
        buf = str_buff;
        while( bytes_sent < count ){
                do{
                        write_len = write( sockfd, buf, count - bytes_sent );
                } while( ( write_len < 0 ) && ( errno == EINTR ) );
                if( write_len <= 0 ){
                        return( NG );
                }
                bytes_sent += write_len;
                buf += write_len;
        }
        return( OK );
}

この関数を呼び出して使うと、
        write_sock( sd, "test strings.\n" );
これはうまくいきました。
だから、ちゃんと動く関数かなと思っていました。
でも、こういう構造体を作って、
struct test_s {
        unsigned long test1;
        unsigned short test2;
        unsigned short test3;
        unsigned short test4;
        unsigned short test5;
} tes_s;
このようにデータをいれました。
    tes_s.test_1 = Data_1;
    tes_s.test_2 = Data_2;
    tes_s.test_3 = Data_3;
    tes_s.test_4 = Data_4;
    tes_s.test_5 = Data_5;
データはちゃんと入っているのを、printf()で確認しました。
この後、
    write_sock( sd, tes_s );
のように呼び出してみましたが、うまくいきませんでした。
char型のデータでないとソケットでは送れないので、なんとか
文字列にしようとしてみたのですが、文字列の連結として
構造体の各データをつなげる方法がうまくいきません。
    memcpy( tes_s, tes_s.test_1, sizeof(tes_s.test_1) );
    memcpy( &tes_s[4], tes_s.test_2, sizeof(tes_s.test_2) );
のようにやっても、tes_sの文字列に入っていないし、
    sprintf( tes_s[0], "%04d", tes_s.test_1 );
とやると、coreを出してとまってしまいました。
正しいやり方というのはあるのですか?
それとも、やっぱり関数が間違っているんですか?
どうかよろしくお願いします。

No. 1571 # けんす 2001/01/15 (月) 18:55:28
>>1569 68user
> これは多分デフォルトで設定されていると思います (というか、
> .html だから text/html になっているんじゃないかなぁ)。

> 同じディレクトリに置いてもダメでしたか?

http://apacheml.ecc.u-tokyo.ac.jp/cgi-bin/namazu.cgi?key=readme&submit=Search%21&whence=0&max=20&format=long&sort=score

なんかバグらしいです、、どうなんだろう、、。

> あと質問なんですが、www.kensu.com の
> Server: Apache/1.3.12 (Unix) OCTO_3.0 PHP/4.0.0 FrontPage/4.0.4.3
> OCTO って何ですか?

http://www.oc.to/ ここのサーバー借りてるのでちょっとわからないです、、

ついでに、、
ディレクトリーリストに表示されるアイコン集、みたいなページ
ご存知ないですか??
php,log,cgiとかが「?」じゃかっこわるいので・・・・

No. 1572 # rocky [E-mail] 2001/01/15 (月) 20:34:43
68USERさん、すばらしいサイトを公開なされていて本当に感謝しております。ネットワークプログラミングの基礎知識はWINDOWSのCHMファイルにコンパイルして手元に置いて大変参考にさせていただいております。(LWPメインの「WEBクライアントプログラミング」の百倍くらい助けていただいております。)

本日書き込みさせていただいたのは、質問と言うよりは要望なのですが、PERL5でHTTPクライアントを作る際、SSLで接続する方法を解説頂いたページを掲載して欲しいのです。お忙しいとは思いますがぜひ実現いただけましたら大変助かります。

それではお体にお気をつけて。
今後のご活躍を期待しております。

No. 1573 # CoreFighter 2001/01/15 (月) 23:08:50
        char TempBuf[10+5+5+5+5+1];

        /* TempBufを初期化 */
        memset(TempBuf, 0x00, sizeof(TempBuf));
        /* TempBufに設定 */
        sprintf(TempBuf, "%d%d%d%d%d",
                tes_s.test_1, tes_s.test_2, tes_s.test_3, tes_s.test_4, tes_s.test_5);

この時TempmBufの大きさは
longを整数にした時の最大桁数 + shortを整数にした時の最大桁数
shortを整数にした時の最大桁数 + shortを整数にした時の最大桁数
shortを整数にした時の最大桁数 + 改行(\r)
です。

No. 1574 # CoreFighter 2001/01/15 (月) 23:21:24
すいません。訂正です。
>この時TempmBufの大きさは
>longを整数にした時の最大桁数 + shortを整数にした時の最大桁数 +
>shortを整数にした時の最大桁数 + shortを整数にした時の最大桁数 +
>shortを整数にした時の最大桁数 + 改行(\r)
>です。
改行(\r)でなくてNULL文字(\0)でした。

No. 1575 # gixs 2001/01/16 (火) 03:00:49
> sprintf(TempBuf, "%d%d%d%d%d",
> tes_s.test_1, tes_s.test_2, tes_s.test_3, tes_s.test_4, tes_s.test_5);

この方針は、
>>1512 gixs
の最後で書いた、数値を文字列として渡す方法ですね。
(つまり、数値10を0x31 0x30のバイト列にしてしまう方法です)
受け手は、自前のパーサなりsscanf(3)なりで、パースして数値に戻します。

でも、"%d%d%d%d%d"ではパースできません。
ゼロ詰めで桁数を決め打ちするか、空白で区切るべきでしょう。

このように文字列で渡す方針が簡単なので、実用アプリならこうすべきですが、どうしても数値のままネットワーク上に流したいとのことなら、ネットワークバイトオーダに変換しながらmemcpy(3)(or memmove(3))します。

# 動かないコードでもいいように、疑似コード(エラー処理なし)。
# および、勝手に、uint32_t tes_s.test1; uint16_t tes_s.test2;ということにします。
char *p = buf;
uint32_t x32 = htons(tes_s.test1);
memcpy(p, &x32, sizeof(uint32_t));
p += sizeof(uint32_t);
uint16_t x16 = htons(tes_s.test2);
memcpy(p, &x16, sizeof(uint16_t));
p += sizeof(uint16_t);
...
write(sock, buf, p - buf);

受け手は、どういうbit数の数値がどう並んでいるかを知った上で、受けたバッファから数値を切り出していきます。

No. 1576 # gixs 2001/01/16 (火) 03:12:37
ひとつ訂正。
最初のhtons()はhtonl()。
# 掲示板への書き込みは難しいですね。他にもミスがあるかも。

No. 1577 # rererenore 2001/01/16 (火) 15:44:33
Perlで
                system関数||die"$!\n"||exit(0);
を使用すると「ファイル番号が違います」とエラーメッセージがでて以上終了を起こします。
こういったエラーの理由が分かるサイトなどありましたら教えて下さい。
またこのエラーの原因をご存知の方がいましたら原因を教えて下さい。
お願いします。

No. 1578 # たろ [E-mail] 2001/01/16 (火) 21:59:09
はじめまして。
perlで、メール本文の内容を分析し、
mimeまたは、プレーンテキストの初めの文書の最終行番号、
mimeのときにテキストがなければ、最初の本文の行番号というように
調べたいのですが、どうすればよいのかわからなくて困っています。
なにか便利なツール、パッケージなどあれば教えてください。
それか調べるポイントでもあれば教えてください。
どうかよろしくお願いします。

No. 1579 # 68user 2001/01/17 (水) 01:01:33
>>1553 CoreFighter
CoreFighter さんへ。質問に対する回答をもらっても、
何の反応も示さないなら、質問するのはご遠慮下さい。

>>1570 E田
> char型のデータでないとソケットでは送れないので
わかっておられるのかもしれませんが、それは write_sock が
そういう書き方になっているからで、本来はソケット経由で
バイナリデータを送れます。

>>1571 けんす
> なんかバグらしいです、、どうなんだろう、、。
なるほど。
# しかし素晴らしい検索能力ですね。バグだとは想像も
# しませんでした。

>> OCTO って何ですか?
> http://www.oc.to/ ここのサーバー借りてるので
ただ単にドメイン名入れてみただけなんでしょうか。

> ディレクトリーリストに表示されるアイコン集、みたいなページ
> ご存知ないですか??
ちろっと探してみましたが、見つかりませんでした。
20x22 だし、適当にでっち上げるのが簡単かもしれませんね。

>>1572 rocky
> PERL5でHTTPクライアントを作る際、SSLで
> 接続する方法を解説頂いたページを掲載して欲しいのです。
SSL のライブラリを使わず、ですか? そりゃまた難しそうだなぁ。
興味はあるので書きたいところですが、あまり期待しないで下さいね。

>>1577 rererenore
さようなら、断りなしにマルチポストする無礼なひと。

>>1578 たろ
「mimeまたは、プレーンテキスト」とか「mimeのときにテキストが
なければ」とかの条件がよく理解できませんでしたが、とりあえず
>>700 68user
が一番お手軽だと思います。

No. 1580 # rocky [E-mail] 2001/01/17 (水) 03:18:42
68USERさん、お返事ありがとうございます。
レンタルサーバーなのでMAKEを使うライブラリのインストールができなくて何でも自力でやっております。
SSLの件、気長にお待ちしておりますのでどうかよろしくお願い申し上げます。

No. 1581 # TT 2001/01/17 (水) 10:24:41
こちらのサイトで得た知識を、下記するところに記入いたしました。

http://www.tnetbbs.com/phorum/read.php?f=4&i=575&t=406

事後報告、かつ、つたない紹介となりましたことをお許しください。
とりいそぎ、ご挨拶まで。

No. 1582 # たろ 2001/01/17 (水) 13:16:57
>>1579 68user
お返事ありがとうございます。
>「mimeまたは、プレーンテキスト」とか「mimeのときにテキストが
> なければ」とかの条件がよく理解できませんでしたが、とりあえず
マルチパートかシングルパートか、でした。失礼しました。
マルチパートで最初のテキストタイプの箇所に文言を追加したいと
思っています。
マルチパートで、文書がないときには、テキストパートを追加します。
ネットワークの知識が少ないのが悲しいところです。

No. 1583 # たろ 2001/01/17 (水) 13:18:45
>>1582 たろ
>ネットワークの知識が少ないのが悲しいところです。
誤解を招くかもしれないので、補足します。もちろん自分のことです。

No. 1584 # arche 2001/01/17 (水) 13:54:46
はじめまして。
突然何? という感じかもしれませんが、このサイトは非常にすばらしいと思います。
自分はPerl屋なのですが、ここほど為になるサイトは今まで見たことがありません。
HTTPクライアントは特に参考になりました。
ありがとうございます。
すばらしい情報が得られる貴重なサイトですね。

あまりの感動につい書き込んでしまいました。
掲示板の趣旨に反していましたら、お詫び致します。

No. 1585 # E田 2001/01/17 (水) 15:26:56
みなさん、回答をありがとうございます。
やってみて、うまく格納できているみたいです。
今は、read()の方をうまくできていないので、ちゃんと
受け取りの構造体に格納できないので、これからなんとか
受け取り側で見れるようにします。
でも、うまくCを書けていなかったのがわかりました。
本当にありがとうございました。

No. 1586 # YAGI [E-mail] 2001/01/17 (水) 17:45:54
以前は、uptimeの質問に対してレスありがとうございました
また、質問があるのですが、
現在サーバ間(UNIX/AIX)でNISの設定をしようとしています。
今回、NISを設定してあるもののバージョンを上げるために、一度NISの設定
を解除して、バージョンをあげて、再設定しようと思っています。
一度試しで行なって見たのですが、Clientのほうで、Server側でマップを更新した後に、ログインができなくなってしまったのです。
(whoamiコマンドで反応がなくなってしまいます)
それで、一度NISを外しまして、再設定を行なった際に、
マップの更新後に、stopsrc -s ypbind
startsrc -s ypbind -a "ypsetme"
ypset (ServerのIPアドレス)
を行なったところ、無事に設定する事が出来ました。

ここで、質問なのですが、今度違う場所で同じ作業があるのですが、
マップ更新後に、whoamiコマンドで行けるか確認して
stopsrc…などのコマンドを打って設定する他にいい方法があるのでしょうか?

私的にはNISの解除の方法がおかしいのかなと思っています。
(1./etc/passwdを戻す、2.smitでNISを解除する)

よろしければ、皆様のご意見を頂きたく思います。
都合上レスが明日になるかもしれませんがよろしくお願い致します

No. 1587 # mak(spriggan [E-mail] 2001/01/17 (水) 18:52:58
初めまして。
現在UNIXでのSocket通信プログラムを書いているのですが
selectシステムコールとFD_ISSETマクロとの
関係がよくわからずにコードを書いていたところ
バグに悩まされています。

select()を使いタイマで割り込み動作を監視しながら
recv()で受信を行うというプログラムを書いています

FD_ZERO( &fdset );
FD_SET( m_Sockfd, &fdset );
while(recv_size != 0)
{
      work_fdset = fdset;

      ret = select( 64, &work_fdset, NULL, NULL, &time_out );

      if( ret == -1)
      {
            異常処理
      }
===============================
      割り込み監視
===============================
      
      if( FD_ISSET( m_Sockfd, &work_fdset ))
      {
            data_size = recv( m_Sockfd, (void*)(m_pData + m_DataSize))
      }

      m_DataSize += data_size;
      recv_size -= data_size;
}

ソースはだいたいこのような感じなのですが、
割り込み監視部分等でコネクションの切断
コネクションの再接続等を行っていると

select()の返り値は0でタイムアウトなのですが
FD_ISSET()マクロの方は返り値が真になってしまい
recv()の発行を行うけれども実際はデータはきておらず
recv()で処理がとまってしまい、割り込みの監視ができなくなって
しまうというようなバグが発生しています。
ならばselectとFD_ISSETの返り値が真である場合にのみ
recv()を発行すればよいと思うのですが
なぜこういうケースがでるのかわからなければ
信用し得る修正にならないので書きこみさせてもらいました。

過去ログなどを検索して調べてみましたが
自分なりのなっとくいく回答がえられませんでした。
よければこういうケースになる条件、回避方法等
お教えいただければと思います。

No. 1588 # mak(spriggan [E-mail] 2001/01/17 (水) 19:14:23
追記ですが、下記のプログラムは
1ポート1コネクションのプログラムです

No. 1589 # CoreFighter 2001/01/17 (水) 21:02:47
>>1553 CoreFighter
> CoreFighter さんへ。質問に対する回答をもらっても、
> 何の反応も示さないなら、質問するのはご遠慮下さい。
すいませんでした。以後気をつけます。

No. 1590 # mak(spriggan [E-mail] 2001/01/17 (水) 22:12:52
自己回答。先ほど質問を書きこんだものですが、
あれからいろいろサイトなどを再びまわって
間違いに気づきました。
お騒がせしました。
ようは
1ポート1コネクションなら
select()の第一引数に取得したソケット記述子+1を指定すれば
よかったんですね。

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