質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Q&A

解決済

2回答

4796閲覧

TCPでのビットマップの送信

cfu0987_APV

総合スコア15

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

0グッド

1クリップ

投稿2016/04/16 07:51

編集2016/04/17 09:15

TCP通信について勉強し始めて日が浅い者です。
数値とビットマップ画像をTCPで送るプログラムを作成しています。
数値は正常に受け取り表示ができました。
しかし、ビットマップについては小さな画像(200kバイト)はなんとか送受信できたのですが、
大きな画像(1M以上)を送ろうとすると、ビルドは完了できますがソフトの起動ができません。
デバックで実行した場合はStack overflowと表示されるため、(A)が問題だと思いますが他の方法が思いつきません。どなたかうまく送れる方法をご教示ください。

〇環境
OS:windouws7(SP1) 32ビットOS
開発:visual C++(2008)
メモリ:4GB
CPU:2.5GHz

〇プログラム
★struct.h:

#define MAX_BMP_SIZE 500000//・・・1M以上を送る場合はここを10000000以上にしています。(A) typedef struct { unsigned short marker;//①マーカー unsigned long size;//②データバイト数 unsigned short tp;//③ヘッダ種別 unsigned short no;//④ヘッダ番号 float x;//数値1 float y;//数値2 unsigned char bmpfile[MAX_BMP_SIZE];//ビットマップ用の配列 } BMP_PIC;

★tTCP.h:

Class CtTCP:public CDialog { ・・・・ public: BMP_PIC m_BmpPic; };

★tTCP.cpp:

static

1 FILE *BMPFP; 2 #define BMPDATA ".\\pic.bmp" 3 void CtTCP::Loop(void) 4 { 5 ・・・・ 6 M_TAB = 0; 7 if(M_TAB == 0){ 8 BMPFP = fopen(BMPDATA, "rb"); 9 10 m_BmpPic.marker = 0xABCD; 11 m_BmpPic.size = sizeof(BMP_PIC) - 10;//・・・実際のデータ(数値+ビットマップ)サイズを指定する。 12 m_BmpPic.type = 0; 13 m_BmpPic.no = 0; 14 m_BmpPic.x = 1000; 15 m_BmpPic.y = 2000; 16 fread(m_BmpPic.bmpfile, 1, sizeof(BMP_PIC), BMPFP); 17 sendsize = send(s1, reinterpret_cast<const char*>(&m_BmpPic), sizeof(m_BmpPic), 0); 18 //↑のs1はソケットです。 19 20 fclose(BMPFP); 21 M_TAB = 1; 22 } 23 }

*ちなみに上のプログラムの場合、送り側で200kのビットマップが受信側では500k近いサイズになっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzukis

2016/04/17 07:09

コードの部分は前後の行を```(バッククオート3つ)で囲むと見やすくなります。コードの部分を選択してエディタで"</>"のボタンを押してもいいです。
cfu0987_APV

2016/04/17 09:16

ご指摘ありがとうございます。 コードを見やすくしました。
guest

回答2

0

ベストアンサー

こんにちは。

ご提示されたソースの範囲では分かりませんが、 CtTCPのインスタンスをスタック上に確保しているのではないでしょうか?
確かスタックのサイズはデフォルトで1MBytesでしたので、これを越えるサイズの領域をスタック上に確保しようとしてスタックオーバーフローが発生しているものと思われます。

CtTCPのインスタンスをスタックではなくヒープ上に確保(newで生成)することをお勧めします。
リークが怖い時は、C++11で使えるstd::unique_ptrを使えばリークしません。

投稿2016/04/16 07:57

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cfu0987_APV

2016/04/19 11:59

ヒープ上に確保した結果、1M以上のファイルの送信に成功しました。 ありがとうございました。
guest

0

BMP_PICが固定サイズなので、画像サイズ問わず「ヘッダ類(BMP_PICbmpfile以外のメンバ)+MAX_BMP_SIZE`」のサイズのデータが送信されるプログラムになっています。

  • sizeはファイルサイズから正しく取得する
  • bmpfileには送信側ではデータを入れない。
  • 画像データそのものは、もっと小さい固定長のバッファ(64KBとか128KBとか)に逐次読み込みつつ送信する。データサイズがあまり巨大でなくメモリに余裕があること前提なら、固定長ではなくファイルサイズ分のメモリを確保して一度に読み込み/送信してもよい

とする方がよいと思います。

分割して逐次送信は面倒くさいと思うかもしれませんが、受信側ではどうせやらないといけないことなのですから、方法は理解しておく必要があります。

投稿2016/04/17 09:38

suzukis

総合スコア1449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問