これ何て呼びますか

こんばんは。
関数が呼び出されるごとに文字列(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;
}

よろしくお願いします。

A 回答 (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を考えると配列の不便さを感じて頂けるのではないでしょうか?
    • good
    • 0

呼び元にカウンタを持ち、引数で回数などを渡さないなら、


関数内にスタティックで/もしくは外部にカウンタを持つ。
# いずれにせよ、配列だと数の上限を気にする必要もある。
# 本質的に、あまりよい構造ではないと思う。

C言語ですか?C++ならば、STLのコンテナにpush_backするのが比較的お手軽。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報