|
>>3132 koko まずは sigaction(2) を読んでください。 # わたしもよくわかってないので読んでいるところ。 |
|
>> 3133 読んでみます。 |
|
ソケット(TCP)に関する質問です。 サーバ(UNIX)とクライアント(WinSock)がソケットで通信しています。 サーバがクライアントに対してwriteでデータを送り、クライアントがrecvでそれを読む処理を作成しました。 サーバでwriteし、すぐにソケットそcloseすると、クライアントではrecvできずにエラーになります。(既に接続が破棄されている。) サーバ側でwriteして、すぐにcloseしている事が原因の様です。 writeとcloseの間に1秒程度の時間をおくと、クライアントはrecvできました。 このように、writeとcloseが連続すると相手がrecvできないケースは当然の事なのでしょうか。 それとも、通常はrecvできるはずであり、他に問題がありそうでしょうか。 同じ経験をした事のある方がの意見なども聞けると助かります。 よろしくお願いします。 |
|
>>3135 koko > 通常はrecvできるはず だと思います。 |
|
>>3136 68user 回答ありがとうございます。 他の原因を調べてみます。 |
|
ファイルハンドルについての質問です。 Net::FTPで動的に作り出したCSVをアップしたいのですが、 ローカルにファイルを書き出さずにputする方法を教えてください。 FileHandle.pmを使って無名のファイルハンドラを作って、 そこにCSVを入れて、$FTP->put(FILEHANDLA)でアップさせる とイメージしているのですが よろしくお願いします。 |
|
>>3135 koko ソケットのクローズはどのAPIを使って(どんなソースコードで)行ってらっしゃいますか? Winsockだと、shutdownを使わずにclosesocketを呼ぶとRSTフラグのセットされたパケットが飛ぶことが あるような覚えがあります。 いずれにせよ、パケットキャプチャしてみると原因に近づけると思います。 |
|
>>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はしていません。 |
|
>>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 知らないのでアレですが。 |