Socketを使って別のPC間でファイルを送受信するソフトを作っています。
送信側ではファイルを読み込んで、データをSendBufで送っています。
受信側ではReceiveBufで受け取って、適当なファイル名をつけてファイルに書き出そうとしていますが、どうもReceiveBufでの受け取りでエラーがでます。データはMB単位の大きいデータなのですが、これが原因なのでしょうか?ファイル転送について何かもっと上手いやり方がありましたら、教えて下さい。お願いします。
テスト環境がないので推測になりますが、TWinSocketStreamを使えば数MBでも後れると思います。
ヘルプで見てください。使い方は、基本的にTStream系のものと同じです。
TWinSocketStreamを使おうとしたのですが、TWinSocketStreamはブロッキング接続のみだと書いてありました。
SocketのプロパティをBlockingにすると、サーバとクライアントの接続ができなくなってしまいました。
初心者なのでイマイチSocketの使い方が判りません。
以前のスレで同じようなのがあったのですが…。
実際にはどういうふうにしたのでしょう?
差し支えなければ教えて下さい。
ブロッキング接続は使いたくない、ということでしょうか。
それとも、ブロッキング接続の方法がわからないということでしょうか。
ブロッキング接続でよければ、
http://www.borland.co.jp/qanda/cbuilder/c0009406.html
にあります。
ちょっとテストする暇がないので…。時間があれば、receivebufのほうもテストしてみます。
よくみたらC++Builderでした。
言語の違いはあっても、VCL自体にさほど違いはありません。
参考程度にしてください。
TWinSocketStreamを使うためにブロッキング接続に挑戦しています。
クライアントソフトで、ファイルのデータをバッファに読み込み、その後
TWinSocketStream.Write(buffer,DataSize)
でソケットストリームに書込みを行っているのですが、この記述の後に、
TWinSocketStream.Size
でストリームのデータサイズを見ると戻り値が0になっています。
Writeメソッドの戻り値はデータサイズがちゃんと返っているのですが…
また、ブロッキング接続では、非ブロッキング接続で行っていたサーバへの接続作業(サーバのIPを指定して接続する)は必要ないのでしょうか?この動作をすると、サーバ側では直接GetThreadイベントに行くみたいですが。
一度に多くの質問をしてしまって申し訳ありませんが、何か知っていましたら教えて下さい。
TWinSocketStream.Sizeは必ず0ですよ。
TWinSocketStream.Seekの戻り値が必ず0ですから。
サーバ側のGetThreadが呼ばれるのはあっています。
そこで、新規にスレッドを作成し、その中でやりとりします。
TServerClientThreadをヘルプで見てください。
このクラスを継承し、clientExecuteメソッドをオーバーライドして使います。
そうだったんですか。サイズが0なのでサーバソフト云々よりクライアントに問題があるとばっかり思っていました。ありがとうございます。1つ謎が解けました。
サーバソフトのほうなんですが、おっしゃる通り、
クラスを継承し、
type
TServerThread=class(TServerClientThread)
public
procedure ClientExecute;override;
end;
(ちなみに今ごろになりますが、3.0で作っています。3.0の場合、ヘルプをみてもClientExecuteメソッドが出てきませんでした。)
OnGetThreadイベントでスレッドを作成し、
SocketThread:=TServerClientThread.Create(False,ClientSocket);
TServerThread.ClientExecuteで受信処理を記述するまではきました。
これを動作させると、クライアントでデータを送る前に行うConnect動作
ClientSocket1.Host:=ServerIp;
ClientSocket1.Active:=True;
の時にスレッドを作ってしまい、ClientExecuteに入らずに処理がどこかへ行ってしまいます。Threadなのでデバッグで追えずに困ってます。
度々ですいません。
あっ、ちなみにあまりにも困ったので非ブロッキング接続でReceiveBufを使ってみましたが、4500Byte位しか受け取れませんでした。
こちらの環境はDelphi5なので、こちらでうまくいってもそちらでうまくいくかどうかはわかりませんね。
非ブロッキング接続で4500バイトくらいというのは正常でしょう。
送受信ともに、小さな量を複数回にわけておくることになります。
Delphi5のヘルプには、これに近いことが書いてあるのですが、Delphi3にはありませんか?
いろいろやっていたもので、返信が遅れました。すいません。
やはり少しずつ送信した場合には受信との同期がとれず、うまくファイルが構成されません。
こうなれば再度ブロッキング接続でスレッドを使って挑戦するしかなさそうです。
この場合クライアントとサーバのソケットを接続する際に特別な処理が必要でしょうか?それともファイルを送る処理をしたらサーバに接続されるのでしょうか?
あー、わけわからない質問ですいません。
いっぱい、いっぱいになってきました〜〜。
ツイート | ![]() |