68user's page 掲示板

Prev< No. 4027〜4032> Next  [最新発言に戻る] [過去ログ一覧]
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 してもよいです。

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