68user's page 掲示板

Prev< No. 4007〜4029> Next  [最新発言に戻る] [過去ログ一覧]
No. 4007 # 68user 2004/10/22 (金) 01:39:07
>>4006 くろ
> POST プログラム名 HTTP/1.0
プログラム名って何ですか? https でなく http ならうまくいくんですか?
POST でなく GET ならうまくいくんですか?

POST を受けてくれる SSL/TLS サーバが手元にないので、
        https://www.rsasecurity.com/solutionsPrimary.asp
に対して以下のリクエストを送信してみましたが、正常なレスポンスを
取得できました。

        POST /solutionsPrimary.asp HTTP/1.0
        Host: www.rsasecurity.com
        Content-Length: 2

        ab

No. 4008 # くろ 2004/10/22 (金) 13:47:15
>>4007 68user

説明に至らない点があったみたいで、すみません。

>プログラム名って何ですか?
これは、POSTをするプログラム名を指しています。

教えて頂いたURLに、POSTしてみたのですが、
サーバーからのレスポンスとして、「HTTP/1.1 400 Bad Request」
が戻ってきました。。。

68userさんでは、上手くいっているようなので、
私のプログラムの問題のようですね。。。

既に6日間も悪戦苦闘しますので、
なにか助言などありましたら、お手数ですが宜しくお願いします。

No. 4009 # 68user 2004/10/22 (金) 13:54:22
>>4008 くろ
> これは、POSTをするプログラム名を指しています。
だからプログラム名って具体的に何ですか?
      POST hoge HTTP/1.0
とかしてたりしませんか? ちゃんと
      POST /hoge HTTP/1.0
としていますか?

んなこたわかっとると思われるかもしれませんが、あなたのレベルが
わからないので、こういうところから確認しているんですよ。

No. 4010 # 68user 2004/10/22 (金) 14:08:46
>>4008 くろ
> 教えて頂いたURLに、POSTしてみたのですが、
> サーバーからのレスポンスとして、「HTTP/1.1 400 Bad Request」
> が戻ってきました。。。
ああ、これを見落としていました。

ではリクエストのやり方が悪いのでしょう。ソースを提示してください。

No. 4011 # くろ 2004/10/22 (金) 15:14:32
>>4010 68user

ご迷惑をお掛けしまして、大変申し訳ありません。
プログラム名ですが、[POST hoge HTTP/1.0] という感じで、
設定しております。

以下がソースになります。

+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>

#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

#define EXT_OK 0
#define EXT_ERR -1
#define LINE_MAX_LEN 512
#define FILE_PATH_LEN 256
#define SEND_XML_LEN 640
#define RECV_VAL_LEN 256

#define SEND_VALUE "xml=送信データ"

int main(int argc ,char *argv[])
{
    int ierr = 0;
    int isockt = 0;
    int read_size = 0;
    struct hostent *servhost; // サーバ情報構造体
    struct sockaddr_in server; // ソケット構造体
    struct servent *service; // サービス構造体
    
    SSL *ssl;
    SSL_CTX *ctx;
    
    char *str;
    char send_buf[SEND_XML_LEN + 1]; // 送信データ
     char request[SEND_XML_LEN + 1]; // ヘッダー
    char total_buf[RECV_VAL_LEN + SEND_XML_LEN + 1]; // 送信データ(ヘッダー + データ)
    char *host = "接続先ホスト名"; // サーバ名セット
    char *path = "CGIパス"; // CGI名セット
    char buf[RECV_VAL_LEN];
    
    memset(send_buf,'\0',sizeof(send_buf));
    memset(request,'\0',sizeof(request));
    memset(total_buf,'\0',sizeof(total_buf));
    
    servhost = gethostbyname(host);
    
    if ( servhost == NULL )
    {
        fprintf(stderr, "[%s] から IP アドレスへの変換に失敗しました。\n", host);
        
        exit( EXT_ERR );
    }
    
    bzero((char *)&server, sizeof(server));
    
    server.sin_family = AF_INET;
    
    bcopy(servhost->h_addr, (char *)&server.sin_addr, servhost->h_length);
    
    service = getservbyname("https", "tcp"); // ポート番号取得
    
     if ( service != NULL )
    {
         server.sin_port = service->s_port;
    }
    else
    {
         server.sin_port = htons(443); // 取得できなかったら、ポート番号を 443 に決め打ち
    }
    
     isockt = socket(AF_INET, SOCK_STREAM, 0);
    
    if ( isockt < 0 )
    {
         fprintf(stderr, "ソケットの生成に失敗しました。\n");
        
        exit( EXT_ERR );
    }
    
    if ( connect(isockt, (struct sockaddr*) &server, sizeof(server)) == -1 )
    {
         fprintf(stderr, "connect に失敗しました。\n");
        
        exit( EXT_ERR );
    }
    
    SSL_library_init(); // SSLのライブラリを初期化
    
    SSL_load_error_strings(); // SSLエラーメッセージ Catch
    
    ctx = SSL_CTX_new(SSLv23_client_method()); // SSLv2を使用
    
    ssl = SSL_new(ctx);
    
    SSL_set_fd(ssl, isockt); // SSLとソケットの関連付け
    
    ierr = SSL_connect(ssl);
    
    sprintf(send_buf,"%s",SEND_VALUE);
    
    sprintf(request, "POST %s.cgi HTTP/1.0\r\n"
                "User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0)\r\n"
                "Content-Length: %d\r\nContent-type: text/xml; "
                "charset=utf-8\r\n\r\n",argv[0],strlen(send_buf));
    
    sprintf(total_buf,"%s%s",request,send_buf);
    
    ierr = SSL_write(ssl, total_buf, strlen(total_buf));
    
    printf("サーバからのレスポンス\n");
    
    while (1)
    {
        memset(buf,'\0',sizeof(buf));
        
        read_size = 0;
        
         read_size = SSL_read(ssl, buf, sizeof(buf)-1);
        
        buf[read_size] = '\0';
        
        if ( read_size > 0 )
        {
            write(1, buf, read_size);
        }
        else
        {
             break;
         }
     }
    
    SSL_shutdown(ssl);
    
     close(isockt); // ソケットクローズ
    
    SSL_free(ssl);
    
    SSL_CTX_free(ctx);
    
     exit( EXT_OK );
}
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+

申し訳ありませんが、ご教授ください。
宜しくお願いします。

No. 4012 # 68user 2004/10/25 (月) 10:06:59
>>4011 くろ
SSL/TLS 以前の問題に見えます。http://X68000.q-e-d.net/~68user/net/
    HTTP クライアントを作ってみよう(1)〜(4)
を読んでください。

No. 4013 # くろ 2004/10/25 (月) 17:16:29
>>4012 68user

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

なんと接続することができました。
ご迷惑をお掛けしまして、申し訳ありません。

No. 4014 # どんぐ 2004/10/25 (月) 20:25:48
環境変数にセットする値をConfigFileから読み込む仕様のシェルがあります。

しかし今その環境変数の値にスペースがある場合にうまく動きません。

具体的には

configFile内に
T_DATE=`date +'%Y%m%d%H%M%S'`

と記述して実際のBシェルの中で
for var in `cat ${CONFIG}`
do
export $var

done
としています。

想定としては
export T_DATE=`date +'%Y%m%d%H%M%S'`
となってほしいのですが

実際には
export T_DATE=`date

export +'%Y%m%d%H%M%S'`=+'%Y%m%d%H%M%S'`
という2つの変数として扱われてしまいます。
これを回避する方法はありませんでしょうか。
使用している環境はHP-UX B.11.11 です。

No. 4015 # 68user 2004/10/25 (月) 21:35:35
>>4014 どんぐ
while read line; do
    eval $line
done < ${CONFIG}

てな感じでどうでしょうか。

No. 4016 # Lococo 2004/10/26 (火) 10:33:08
Vacancies in SUN China
In 1982 Sun Microsystems created a business vision named “The Network is the Computer”. In the same year Sun initiated R&D on Java Technology. Today Sun is recognized by all as the Premier Network Enterprise Computing Vendor and have a global presence in over 100 countries. In 1987, Sun entered China market and has been dedicated to the technology and customer solution development in China.

Customer Solution Center in Beijing expand repidly to provide technical hot line suppot to mission critical customers. We invite top nortch engineers to join our champion team in Beijing to provide world-class customer services.

Solution Center Engineer (GC0201938) (53 Vacancies)
UNIX generalist responsible for providing system support that includes hardware, software, software applications, and networking to customers via telephone support. Incumbent must be university graduate in Computer Science / Electronic Engineering, knowledgable in O/S like Unix, Linux or Solaris systems, fluent in written and spoken Japanese and with minimum 3 years of Unix Sever Support, System Integration or internal MIS support of Unix Sever.

Solution Center Manager (GC0201941) (2 Vacancies)
Manages and directs the activities of the Solution Center teams to provide customer facing technical post sales support of both hardware and software issues. Accountable for meeting operational excellence, customer satisfaction and people management goals of Solution Center. Liaise closely with the product technical support group for technical escalation as well as the local field operations. Incumbent must be Universtiy graduate in Computer Science / Electronics Engineering, 10 years customer support experience with 5 years in managerial capacity and fluent in written and spoken Japanese, good English is a plus.


To apply this position, Please send your resume in English, Mandarin or Japanese and marked with position code to Lisa.wu@multimage.com.cn.
Contact:
Tel: +86 10-65057881-17 Lisa
                              84580901-17 Lisa
Mob: 13501160969
Fax: +86 10-65057880/84583069

No. 4017 # さいさん 2004/10/26 (火) 20:42:17
duコマンドで、ディスクの使用率をバイトで表示しようと以下の
コマンドを実施したのですが、サイズとディレクトリ名との間に
改行が入り、一行で表示できません。
サイズとディレクトリ名を一行で表示し、その後、改行したいの
ですがどうすればよいですか。

5295104
        .
2594816
        ./tmp1
1864704
        ./tmp2
821248
        ./tmp3
10240
        ./tmp4
      

5295104 .
2594816 ./tmp1
1864704 ./tmp2
  821248 ./tmp3
    10240 ./tmp4

としたいのですが。

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

No. 4018 # 68user 2004/10/26 (火) 21:05:45
>>4017 さいさん
> du -k $1 | sort -n -r | awk '{ system("echo "$1"*1024 | bc"); printf(" %s\n", $2) }'
改行コードが余分なわけなので
    du -k | sort -nr | awk '{ system("echo "$1"*1024 | bc | tr -d \\\\n"); printf(" %s\n", $2) }'
    du -k | sort -nr | awk '{ system("echo -n `echo "$1"*1024 | bc`"); printf(" %s\n", $2) }'
とか。

わたしなら「わかりづらい」「無駄なプロセス生成が嫌」という理由から、
    du -k | sort -nr | awk '{ printf("%6d %s\n",$1*1024,$2)}'
などとします。

No. 4019 # さいさん 2004/10/26 (火) 23:04:36
>>4018 68user

>du -k | sort -nr | awk '{ printf("%10d %s\n",$1*1024,$2)}'
と最初はやっていたのですが、$1に設定されるブロックサイズが大きい
と「$1*1024」でオーバーフローを起こし、正しい計算ができないので
systemで、bcで計算をするようなことに

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 やパイプラインなどの、コネクションを切断せずに
複数のデータを取得するための仕組みが考案されているわけです (これも
アプリケーション層での工夫です)。

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