FTP送信するアプリケショーンを作成したのですけど、
Windows98上で実行をおこなうと画面が再描画されな
くなります。
Windows2000では問題無く動作します。
過去ログを見ると、メモリリークとかのお話があるようですが、
根本的な解決策まで書いておりませんでしたので、
投稿しました。
どなたか、このような現象をご存知な方はおりませんか?
よろしくお願い致します。
[現象的
・エディットで表示していたのが表示されない。
・コンボボックスではプルダウンはできるもの
リストが表示されない。
・ボタンのキャプションが表示されない。
開発環境:Windows2000pro(SP2) + VisualC6.0
リソース不足になったとか。
Eighty さん
お返事ありがとうございます。
リソース不足で解決方法を
探してたら
この用な記事が
http://support.microsoft.com/default.aspx?scid=kb;ja;171843
winsockがらみのリソース不足ですかね?
1.FtpPutFileでファイル送信します。
2.ファイル送信後にwinsockでFTP接続
3.ファイル一覧(LIST -lR)コマンド送信
4.結果を受信し、表示しております。
1〜4を通して、動作確認すると1回で
上記の現象が起こりますけど・・・
2,3,4をコメントアウトし、1を繰り返し動作させると
上記の現象が起こります。
もう少し調査したいと思います。
何かご存知でしたらアドバイスお願いします。
アクセサリに「リソースメータ」があるので
それ起動して、実行してみては。
Eighty さん
Windows98にアクセサリの中に「リソースメータ」が
ないです。
しかし、やっぱりリソース問題でした。
ファイル一覧を表示するためのバッファのサイズを
1000000していたのが問題でした・・・。。。
ファイルサイズを小さくしたところ・・・
解消しました。
しかし・・・
-rw-r--r-- 1 abc 2030 65 Apr 14 2003 a.txt
-rw-r--r-- 1 abc 2030 65 Apr 14 2003 b.txt
-rw-r--r-- 1 abc 2030 103 Apr 14 2003 c.txt
-rw-r--r-- 1 abc 2030 16 Apr 14 2003 d.txt
-rw-r--r-- 1 abc 2030 53 Apr 14 2003 e.txt
入れる場所が小さいと困ります・・・
> Windows98にアクセサリの中に「リソースメータ」が
> ないです。
インストールしましょう。
> ファイル一覧を表示するためのバッファのサイズを
> 1000000していたのが問題でした・・・。。。
スタックに積むのではなく、ヒープから確保してみてはいかがでしょうか?
> Windows98にアクセサリの中に「リソースメータ」が
> ないです。
[スタート]-[プログラム(P)]-[アクセサリ]-[システム ツール]-[リソース メーター]
にないですか?
Eighty さん
・・・リソースメーターないみたいです。
インストールしていないみたいです。
後日、インストールしますね。
>スタックに積むのではなく、ヒープから確保してみてはいかがでしょうか?
ヒープ? ちょっとどうのように実現するのかが・・・
すいません。
今、困っているのが・・・
-rw-r--r-- 1 abc 2030 65 Apr 14 2003 a.txt
-rw-r--r-- 1 abc 2030 65 Apr 14 2003 b.txt
毎回こういう結果が返ってくるなら、難しくないですけど・・・
例えば・・・
-rw-r--r-- 1 abc 2030 65 Apr 14 2003 a.txt
-rw-r
こういう結果とか・・・
abc 2030 65 Apr
とか・・・ 返ってくる値がまちまちなので・・・
どのようにリストボックスに表示するのかが
難しく悩んでおります。
以上です。
> ファイル一覧を表示するためのバッファのサイズを
> 1000000していたのが問題でした・・・。。。
> ファイルサイズを小さくしたところ・・・
> 解消しました。
私には、このへん意味不明。
なぜ、ファイルサイズを小さくすると、解消するの。
バッファのサイズを小さくして、解消するなら分かるけど。
どのようにしてファイル一覧を取得して表示しているか、
部分的にソースコードを示してくれると
答えやすいと思います。
Eighty さん
ご親切にお付き合いどうもありがとうございます。
>バッファのサイズを小さくして、解消するなら分かるけど。
はい。 その通りでございます。w
バッファのサイズを小さくしたところで上記の現象が解消できました。
ソースですか・・・ 途中なんですけど・・・
改行ごとにリストボックスに登録しよと
試みてるところですが・・・
改行コードをどのように取得できるのか
探しております ^^
/* ソケットから文字列を受信します */
/* 受信した文字列は buf に入ります */
/* 受信する文字列はサーバが送信したものです */
count = 0;
i = 0;
list_count = 0;
list_first = FALSE;
lstrcpy(buf_sub, "");
SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_RESETCONTENT,(WPARAM)0,(LPARAM)0);
while (1) {
buf_len = recv(soc, buf, MAX_PATH - 1, 0);
if (buf_len == SOCKET_ERROR ){
fprintf(stderr,"サーバからの受信失敗\n");
shutdown(soc, 2);
closesocket(soc);
WSACleanup();
MessageBox(ahWnd,"FTPセッション(サーバ受信)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR);
return(FALSE);
}
if ((buf_len == 0) || (buf_len == -1)) {
break;
}
buf[buf_len] = '\0'; /* 受信したバッファの後ろにNULLを付加する */
lstrcat(buf_sub, buf);
i = i + buf_len;
while (1) {
i = lstrlen(buf_sub);
idx = strspn(buf_sub, "\r\n");
if (i == idx) {
break;
} else {
strncpy(buf, buf_sub, idx);
idx = strspn( buf, "total" );
if (idx != 5) {
idx = strspn( buf, "./");
if (idx > 1) {
list_count++;
SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_INSERTSTRING,(WPARAM)list_count,(LPARAM)"");
}
idx = strspn( buf, "d");
if (idx != 1) {
list_count++;
SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_INSERTSTRING,(WPARAM)list_count,(LPARAM)buf);
}
}
strncpy(buf, buf_sub + strspn(buf_sub, "\r\n"), lstrlen(buf_sub));
lstrcpy(buf_sub, buf);
}
}
}
もう少し調査してみまーす♪
> 改行コードをどのように取得できるのか
サーバーがUNIXなら、改行コードはLFだと思いますが。
> 改行コードをどのように取得できるのか
「改行コードをどのように取得できるのか」ではなく、
「行の途中で切れたときの処理はどうすればいいか?」
という質問ですか?
Eightyさーん
返事遅くなって申し訳ございません
御仕事御疲れ様です。(^〇^)v
今までのプログラムが破綻しちゃって・・・
ボロボロで作り直してる最中です・・・涙
改行コードの取得方法がわかりません。。。
-rw-r--r-- 1 abc 2030 65 Apr 14 2003 a.txt\r\n
-rw-r--r-- 1 abc 2030 65 Apr 14 2003 b.txt\r\n
-rw-r--r-- 1 abc 2030 65 Apr
どのように取り出すのかが、
今までトークンを使っていましたが
3行目の情報が取り出せないので
困っております。
以上です。
> ヒープから。
#define BUFF_SIZE 1024
char *buf = NULL;
buf = new char [BUFF_SIZE];
if(buf == NULL){
// error: out of memory
}
// (snip)
delete[] buf;
> 改行コード
例えば、以下のようにすれば、改行コードがLFかLF+CRかCRか不明でも、
改行コードの位置を判別可能です。
if(buf[i] == '\n){
// 改行コード発見
}else if(buf[i] == '\r'){
if(buf[i+1] == '\n'){
i++;
}
// 改行コード発見
}
> 行の途中で読み込みデータが切れている
もう一つバッファを用意し、そこに溜めておくとか。
次のデータを読み込んだ後、連続データとして処理すればよい。
ちょい面倒なので、イメージだけ。
char buff[400]={0};
size_t offset=0, len=0;
for(;;){
// 第一引数の位置に第二引数のサイズだけ入力する関数と想定
ReadData(buff + offset, 400 - offset);
len=strlen(buff); // 例えば len=200
if(len==0){
break;
}
// 必要な処理
// 残ったデータの先頭位置が firstからのオフセットで offset=180とする
memmove(buff, buff + offset, len - offset);
offset=len - offset;
buff[offset]='\0'; // 終端文字を付加
}
ミス修正
> firstからのオフセットで
buffからのオフセットで例えば
RAPT さん
おはようございます。
できました。
オフセットとか・・・ ヒープとか・・・
ちょっとわからなかったのですけど・・・(^^;
わざわざ夜遅くにレスありがとうございます。
本当に助かりました。
Eightyさん 並びに RAPTさん
長いお付き合いどうもありがとうございました。
/* ソケットから文字列を受信します */
/* 受信した文字列は buf に入ります */
/* 受信する文字列はサーバが送信したものです */
intfirst = 0;
list_count = 0;
SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_RESETCONTENT,(WPARAM)0,(LPARAM)0);
while (1) {
buf_len = recv(soc, buf, MAX_PATH - 1, 0);
if (buf_len == SOCKET_ERROR ){
fprintf(stderr,"サーバからの受信失敗\n");
shutdown(soc, 2);
closesocket(soc);
WSACleanup();
MessageBox(ahWnd,"FTPセッション(サーバ受信)を確立できませんでした ","Parameter Error",MB_OK|MB_ICONERROR);
return(FALSE);
}
if ((buf_len == 0) || (buf_len == -1)) {
break;
}
buf[buf_len] = '\0'; /* 受信したバッファの後ろにNULLを付加する */
i = 0;
while (buf_len > i) {
if(buf[i] == '\r'){
if(buf[i+1] == '\n'){
i++;
buf_sub[intfirst] = '\0';
SendDlgItemMessage(ahWnd,IDC_FILELIST,LB_INSERTSTRING,(WPARAM)list_count,(LPARAM)buf_sub);
list_count++;
intfirst = 0;
}
} else {
buf_sub[intfirst] = buf[i];
intfirst++;
}
i++;
}
}
ツイート | ![]() |