HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0331
Sucretnicoさんへ、ファイル送受信サンプル作ってみました10解決


Sucret

リンク

2009/3/31(Tue) 00:36:37|NO.24270

以前の質問でサンプルでもあればと書いてあったので作ってみました。
参考にでもお使い下さい。

#include"hspsock.as" //変数IPを文字列型に(ついでにPathも) sdim IP sdim path screen 0,320,120 objsize 120,40 button"ファイル送信",*sendfile button"ファイル受信",*getfile stop ; ▼▼▼サーバー側▼▼▼ *sendfile //サーバー側がファイル送信。 cls mes"ポート番号" input port,320,20,5 mes"送信するファイル" input path,300,20,5 objsize 20,20 pos 300,ginfo(23)-20 button"...",*SendFileSelect objsize 120,30 pos 190,85 button"ポート開放",*Server *SendFileSelect dialog"*",16 if stat=1 { path=refstr objprm 1,path } stop *Server exist path if strsize<=0:dialog"ファイルが選択されていないか存在しません。":stop FileSize=strsize //ソケットを初期化 sockmake 0,port if stat!0:dialog"ソケットの初期化に失敗しました。":stop cls //IPアドレスを取得、表示。LAN外での通信の場合はグローバルIPアドレスが必要です。 ipget title"IPアドレス : "+refstr //ここからクライアント待ち repeat sockwait 0 if stat=0:break if stat>1:dialog"クライアントを待つ際にエラーが発生しました。":goto,*exit wait 1 loop //通信成功 onexit,*exit //ファイル送信開始 //ファイル情報を文字列型変数で相手に送信 //1行目にファイル名、2行目にファイル容量 sdim FileInfo FileInfo=getpath(path,8)+"\n"+FileSize sockput FileInfo,0 //相手がファイル情報を確認できたことを確認したらファイル送信開始 repeat sockcheck 0 if stat=0:break wait 1 loop sockgetc check,0 //ファイル情報を送信 sdim FileData,FileSize bload path,FileData,FileSize //容量分を一気に送信 sockputb FileData,0,FileSize,0 //相手が受信完了し、返信が来るのを待つ。 //相手の受信完了を確認する repeat sockcheck 0 if stat=0:break wait 1 loop sockputc check,0 //終了 goto,*exit ; ▼▼▼クライアント側▼▼▼ *getfile //クライアント側はファイル受信。 cls mes"IPアドレス" input IP,320,20,15 mes"ポート番号" input port,320,20,15 objsize 120,30 pos 190,85 button"接続",*Client stop *Client sockopen 0,IP,port if stat!0:dialog"接続に失敗しました。":stop //接続成功 onexit,*exit //ファイル受信開始 //ファイル情報を受け取るまで待つ repeat sockcheck 0 if stat=0:break wait 1 loop //getフォルダがなければ作成 dirlist note,"Get",5 if stat=0:mkdir"Get" //ファイルの情報を取得 notesel FileInfo sockget FileInfo,40960,0 noteget FileName,0 noteget FileSize,1:FileSize=int(FileSize) //確認完了をサーバーに送信 sockputc 0,0 //受信容量が見やすくなるようにウィンドウを大きくしてみました screen 0,640,120 //ここから受信開始 total=0 sdim FileData,FileSize repeat //ファイルデータの着信確認 sockcheck 0 if stat=0 { //FileData変数にデータを読み込む。 sockgetb FileData,total,FileSize-total,0 //オフセット用にtotalに受信したサイズstatを加算していく。 total=total+stat title""+total+"byte受信完了 : 受信サイズ"+stat+"byte" } //受信サイズがファイルサイズなら終了 if total=FileSize:break wait 10 loop //ファイルを保存 bsave"Get/"+FileName,FileData,FileSize //確認用に1byte送信 sockputc 0,0 //終了 *exit sockclose 0 end



この記事に返信する


nico

リンク

2009/3/31(Tue) 07:38:35|NO.24272

朝起きてこちらを見てびっくりしました・・・。
色々ヒントももらい、更にサンプルまで用意してもらってありがとうございます。
お手数おかけしましたm(__)m

このサンプルを参考にさせていただいて完成まで運べたら・・・と思います。

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



ki

リンク

2009/4/1(Wed) 23:02:45|NO.24327

この方法だと大きなファイルを送信したときに
とびませんか?



Sucret

リンク

2009/4/1(Wed) 23:37:21|NO.24328

>>kiさん
 HSPで通常扱える数値は2147483648、つまり2GBまでなので、それ以上のファイルは
扱えないことは想定していますが、もしかして2GB以内のファイルでも失敗しますか?
あと、容量の大きなファイルを送信すると送信時に時間がかかるみたいなので改善してみます。



Sucret

リンク

2009/4/1(Wed) 23:40:58|NO.24329

100MBでは成功しましたが、400MBだと失敗しました。
すみませんでした、訂正完了後、スクリプトを上げたいと思います。



Ki

リンク

2009/4/2(Thu) 00:42:21|NO.24332

550までは確認がとれました。
改良するところは、
Sdimでメインメモリフルに使うと
とぶので100ぐらいづつ送ると
いいかもしれません。

改良されてアップされるの待ってます。



Sucret

リンク

2009/4/2(Thu) 01:00:55|NO.24333

再び長いスクリプトを申し訳ございません、完成しました。
一応1.72GBのファイルも問題なく送信出来ました。

#include"hspsock.as" //変数IPを文字列型に(ついでにPathも) sdim IP sdim path screen 0,320,120 objsize 120,40 button"ファイル送信",*sendfile button"ファイル受信",*getfile stop ; ▼▼▼サーバー側▼▼▼ *sendfile //サーバー側がファイル送信。 cls mes"ポート番号" input port,320,20,5 mes"送信するファイル" input path,300,20,5 objsize 20,20 pos 300,ginfo(23)-20 button"...",*SendFileSelect objsize 120,30 pos 190,85 button"ポート開放",*Server *SendFileSelect dialog"*",16 if stat=1 { path=refstr objprm 1,path } stop *Server exist path if strsize<=0:dialog"ファイルが選択されていないか存在しません。":stop FileSize=strsize //ソケットを初期化 sockmake 0,port if stat!0:dialog"ソケットの初期化に失敗しました。":stop cls //IPアドレスを取得、表示。LAN外での通信の場合はグローバルIPアドレスが必要です。 ipget title"IPアドレス : "+refstr //ここからクライアント待ち repeat sockwait 0 if stat=0:break if stat>1:dialog"クライアントを待つ際にエラーが発生しました。":goto,*exit wait 1 loop //通信成功 onexit,*exit //ファイル送信開始 //ファイル情報を文字列型変数で相手に送信 //1行目にファイル名、2行目にファイル容量 sdim FileInfo FileInfo=getpath(path,8)+"\n"+FileSize sockput FileInfo,0 //相手がファイル情報を確認できたことを確認したらファイル送信開始 repeat sockcheck 0 if stat=0:break wait 1 loop sockgetc check,0 //残り送信サイズをSendFileSizeに代入 SendFileSize=FileSize //見易くするために screen 0,640,120 //一度に送信するサイズを指定 sending=500*1024 sdim FileData,sending repeat //ファイルを必要な分だけ読み込んで、送信 bload path,FileData,limit(sending,0,SendFileSize),cnt*sending sockputb FileData,0,limit(SendFileSize,0,sending),0 SendFileSize-sending if SendFileSize<=0:break color 255,255,255:boxf color:pos 0,0 mes"残り"+SendFileSize+"byte" mes""+int(100.0-double(SendFileSize)/FileSize*100)+"%完了" wait 1 loop ; sockputb FileData,0,FileSize,0 //相手が受信完了し、返信が来るのを待つ。 //相手の受信完了を確認する repeat sockcheck 0 if stat=0:break wait 1 loop sockputc check,0 //終了 goto,*exit ; ▼▼▼クライアント側▼▼▼ *getfile //クライアント側はファイル受信。 cls mes"IPアドレス" input IP,320,20,15 mes"ポート番号" input port,320,20,15 objsize 120,30 pos 190,85 button"接続",*Client stop *Client sockopen 0,IP,port if stat!0:dialog"接続に失敗しました。":stop //接続成功 onexit,*exit //ファイル受信開始 //ファイル情報を受け取るまで待つ repeat sockcheck 0 if stat=0:break wait 1 loop //getフォルダがなければ作成 dirlist note,"Get",5 if stat=0:mkdir"Get" //ファイルの情報を取得 notesel FileInfo sockget FileInfo,40960,0 noteget FileName,0 noteget FileSize,1:FileSize=int(FileSize) //確認完了をサーバーに送信 sockputc 0,0 //受信容量が見やすくなるようにウィンドウを大きくしてみました screen 0,640,120 //ここから受信開始 total=0 sdim FileData,500*1024 bsave"Get/"+FileName,FileData,0 repeat //ファイルデータの着信確認 sockcheck 0 if stat=0 { //FileData変数にデータを受信 sockgetb FileData,0,FileSize-total,0 //オフセットを使用し、受信した分を保存 bsave"Get/"+FileName,FileData,stat,total //オフセット用にtotalに受信したサイズstatを加算していく。 total=total+stat color 255,255,255:boxf color:pos 0,0 mes""+total+"byte受信完了 : 受信サイズ"+stat+"byte" mes""+int(double(total)/FileSize*100)+"%完了" } //受信サイズがファイルサイズなら終了 if total=FileSize:break wait 1 loop //ファイルを保存 //確認用に1byte送信 sockputc 0,0 //終了 *exit sockclose 0 end



ki

リンク

2009/4/2(Thu) 23:01:05|NO.24359

やはりうまく送受信できてないですね。
単品だと良くできてもZIPで圧縮したのが
よく3Mか6Mくらいしかできてなかったりしますね。
なにかエラーってますよ。



ki

リンク

2009/4/3(Fri) 11:03:01|NO.24368

自分だけですか?



Sucret

リンク

2009/4/3(Fri) 18:38:37|NO.24390

11MBのファイルを作って送ってみましたが、バイナリエディタで見ても異常はありませんでした。
環境によって送信できる最大サイズも違うかもしれないので[sending]変数の値を小さくしたらできないでしょうか?
私自身もソケット関係の命令は未だわからない部分が多いので…もうすこし調べてみたいと思います。



GENKI

リンク

2009/4/4(Sat) 00:31:22|NO.24417

>  HSPで通常扱える数値は2147483648、つまり2GBまでなので、それ以上のファイルは
> 扱えないことは想定していますが、もしかして2GB以内のファイルでも失敗しますか?

これの出番ですか?
http://hspdev-wiki.net/?64bit%20%C0%B0%BF%F4%A4%F2%BA%C6%B8%BD



ONION software Copyright 1997-2023(c) All rights reserved.