68user's page 掲示板

Prev< No. 3133〜3141> Next  [最新発言に戻る] [過去ログ一覧]
No. 3133 # 68user 2003/03/10 (月) 22:33:46
>>3132 koko
まずは sigaction(2) を読んでください。

# わたしもよくわかってないので読んでいるところ。

No. 3134 # koko 2003/03/11 (火) 08:08:55
>> 3133
読んでみます。

No. 3135 # koko 2003/03/14 (金) 17:50:58
ソケット(TCP)に関する質問です。
サーバ(UNIX)とクライアント(WinSock)がソケットで通信しています。
サーバがクライアントに対してwriteでデータを送り、クライアントがrecvでそれを読む処理を作成しました。
サーバでwriteし、すぐにソケットそcloseすると、クライアントではrecvできずにエラーになります。(既に接続が破棄されている。)
サーバ側でwriteして、すぐにcloseしている事が原因の様です。
writeとcloseの間に1秒程度の時間をおくと、クライアントはrecvできました。
このように、writeとcloseが連続すると相手がrecvできないケースは当然の事なのでしょうか。
それとも、通常はrecvできるはずであり、他に問題がありそうでしょうか。
同じ経験をした事のある方がの意見なども聞けると助かります。
よろしくお願いします。

No. 3136 # 68user 2003/03/15 (土) 04:04:27
>>3135 koko
> 通常はrecvできるはず
だと思います。

No. 3137 # koko 2003/03/17 (月) 08:28:29
>>3136 68user
回答ありがとうございます。
他の原因を調べてみます。

No. 3138 # ajmj 2003/03/17 (月) 18:18:45
ファイルハンドルについての質問です。
Net::FTPで動的に作り出したCSVをアップしたいのですが、
ローカルにファイルを書き出さずにputする方法を教えてください。
FileHandle.pmを使って無名のファイルハンドラを作って、
そこにCSVを入れて、$FTP->put(FILEHANDLA)でアップさせる
とイメージしているのですが
よろしくお願いします。

No. 3139 # 金床 [URL] [E-mail] 2003/03/17 (月) 23:24:58
>>3135 koko
ソケットのクローズはどのAPIを使って(どんなソースコードで)行ってらっしゃいますか?
Winsockだと、shutdownを使わずにclosesocketを呼ぶとRSTフラグのセットされたパケットが飛ぶことが
あるような覚えがあります。

いずれにせよ、パケットキャプチャしてみると原因に近づけると思います。

No. 3140 # koko 2003/03/18 (火) 11:17:29
>>3139 金床
パケットをキャプチャしてみたところ、サーバからクライアントにRSTフラグのセットされたパケットは飛んでいました。

試したケースを整理します。
(1)accept直後にクライアントからの送信データをreadせずに、サーバ側から
write、closeすると、クライアントではサーバがwriteしたデータを受信できません。
(2)accept直後にクライアントからの送信データを1バイトでも良いのでreadし、サーバ側からwrite、closeすると、クライアントではサーバがwriteしたデータを受信できます。

(2)では、RSTフラグのセットされたパケットが飛ぶ前に、FIN ACKがセットされたパケットとクライアントで受信させたいパケットが飛んでおり、(1)ではFIN ACKがセットされたパケットとクライアントで受信させたいパケットが飛んでいません。

サーバ側でクライアントの送信電文を1バイト読む事で動きが変わるようなのですが、この辺が何か関係があるのかもしれません。

ちなみに、APIは以下の通りです。
サーバ(UNIX):socket,bind,listen,accept,select,read,write,close
クライアント(WIN):socket,bind,connect,listen,recv,send,closesocket

サーバ側でのソケットのクローズは、acceptの戻り値を引数にしてcloseをしているのみで、shutdownはしていません。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3141 # 68user 2003/03/18 (火) 21:02:38
>>3138 ajmj
> FileHandle.pmを使って無名のファイルハンドラを作って、
> そこにCSVを入れて、$FTP->put(FILEHANDLA)でアップさせる
というのが実現可能なのかどうかはわかりませんが (できない
ような気がする)、別解としては

    1. put じゃなくて stor("ファイル名") を呼ぶと、Net::FTP::dataconn
          オブジェクトが返ってくるので、それに対して write する。

    2. POSIX::mkfifo で名前付きパイプを作り、fork して、
          子が CSV データを作成、名前付きパイプに書き込む。
          親は Net::FTP::put に名前付きパイプを渡す。

あたりですかね。1 は perldoc Net::FTP を流し読んだだけで、
できるかどうかわかりません。2 は試していませんが、一応実現は
できるでしょう。

>>3140 koko
    http://www.kt.rim.or.jp/~ksk/wskfaq-ja/newbie.html#howclose
ですかね?

あと、情報を小出しにせず、最小限まで削ったソースコードを最初に
載せれば、話が早そうなのになぁと思ったりします。

まぁわたしは Winsock 知らないのでアレですが。

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