• 締切済み

関数が呼び出されるごとに文字列(IPアドレス)を格納したいのですが・・・

こんばんは。 関数が呼び出されるごとに文字列(IPアドレス)を格納したいと思っているのですが、どのように記述すればよいか分かりません。 以下にプログラムを示します。 以下のプログラムは、int UDPReceive_IPaddr関数のwhileループ内のIPaddrstorage関数が呼び出されるたびに、IPaddrstorage関数内にて配列を用いて他の端末のIPアドレスを格納したいと考えています。 しかし、関数が毎回呼び出されるため、配列の記述の仕方に困っています。なにか解決方法はありますでしょうか? [プログラム] int UDPReceive_IPaddr(u_short portNo) { char IPaddr[16]; int size; //他の端末からIPアドレスをHELLO文字列(パケット)を受信することで知る。 while(1){ if(size == 5){ if(memcmp(recv_Buf,"HELLO",5) == 0){ strcpy(IPaddr,inet_ntoa(from.sin_addr)); IPaddrstorage(IPaddr); } } } int IPaddrstorage(char *IPaddr){ //配列を用いて、他の端末のIPアドレスを格納したいと考えています。 return 0; } よろしくお願いします。

みんなの回答

回答No.2

まず、格納するデータ形式を考えます。 コードをお読みしたところC言語での記述を考えられているようですのでC言語でのアドバイスとさせて頂きます。 格納形式は、簡単には 1.配列で格納する。 2.線形リストで格納する という2つの方法があると思います。 1.の方法は、サイズを可変することが難しいので、2の方法がいいと思います。 struct AddressList{ char ip_addr[16]; //255.255.255.255; AddressList* next; } 線形リストについては、Webや本などに詳しく説明されているので、そちらをご参照ください。 配列であれば、 char ip_addr[16]; をMAX_NUM個保存するとしましょう。 加えて、何個まで保存しているのかを示す数 int save_num; を定義します。 typedef struct { char ip_addr[MAX_NUM][16]; int save_num; }SaveAddress; 次に、Interfaceを考えます。 void InitSaveAddress(SaveAddress* sa){ sa->save_num = 0; } char* GetSaveAddress(SaveAddress* sa,unsigned int n){ if(sa->save_num < n) return NULL; else return sa->ip_addr[n]; } n番目のAddressを返す。 unsigned int AddSaveAddress(SaveAddress* sa,char* IPaddr){ if(sa->save_num == MAX_NUM); return FALSE; else{ strcpy(sa->ip_addr[sa->save_num+1],IPaddr); sa->save_num++; return sa->save_num; } } Addressを追加する。 こんな感じでいかがでしょうか?構造体に必要なデータをまとめて、それを操作する関数群を作成していくとわかりやすいと思います。 使うときには、 InitSaveAddressをして AddSaveAddressを繰り返せばよいと思います。 さて、ここで不必要なAddressを削除するDeleteSaveAddressを考えると配列の不便さを感じて頂けるのではないでしょうか?

すると、全ての回答が全文表示されます。
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

呼び元にカウンタを持ち、引数で回数などを渡さないなら、 関数内にスタティックで/もしくは外部にカウンタを持つ。 # いずれにせよ、配列だと数の上限を気にする必要もある。 # 本質的に、あまりよい構造ではないと思う。 C言語ですか?C++ならば、STLのコンテナにpush_backするのが比較的お手軽。

すると、全ての回答が全文表示されます。

関連するQ&A