sockaddr_in構造体を初期化してみます。

 

H8OSのsyscall.hではsockaddr_in構造体は

 struct sockaddr_in {
 unsigned char sin_len;  // 構造体の大きさ
 unsigned char sin_familly; // PF_INET
 unsigned short sin_port;  // ポート番号
 unsigned int sin_addr;  // アドレス
 };

のように設定されています。

また、sin_familly(sin_familyではない)は

#define AF_UNIX 1
#define AF_INET 2

となっています。

 

main.c

#include <h8/reg3067.h>
#include <h8/syscall.h>

struct sockaddr_in *addr;

int main(void){
 printf("\nmain program start!!\n");
 printf("before len=%d\n", addr->sin_len);
 printf("before familly=%d\n", addr->sin_familly);
 printf("before port=%d\n", addr->sin_port);
 printf("before addr=%d\n", addr->sin_addr);
 addr->sin_familly = AF_INET;
 addr->sin_port = 0;
 addr->sin_addr = 0;
 printf("after len=%d\n", addr->sin_len);
 printf("after familly=%d\n", addr->sin_familly);
 printf("after port=%d\n", addr->sin_port);
 printf("after addr=%d\n", addr->sin_addr);
 return 0;
}

 

単純に初期化するだけのプログラムです。

実行結果は、

 

次に、sockaddr_inをタスク管理バッファで扱います。

入れ子とかネストと呼ばれるプログラムです。

sockaddr_inはポインタ渡しです。

 

main.c

#include <h8/reg3067.h>
#include <h8/syscall.h>
#include <string.h>
#include <stddef.h>

#define FALSE 0

typedef unsigned char UB;

//sockaddr_inの実体を作る

struct sockaddr_in a;

/**
 * TCPソケット通信のタスク管理バッファ
 */
typedef struct _task {
 int    data;
 int    sock;     //TCPコネクション処理割込みハンドラのID
 UB     txEnable :1;   //送信可能かを示すフラグ(ACKが返ってきているか?)
 struct    sockaddr_in *addr;  //通信相手のアドレス情報
} TcpTask;

#define MAX_TASK 6
static TcpTask info[MAX_TASK]; //有効なソケット通信情報

/**
 *
 * @param index
 */
void clearTcpTask(int index) {

 info[index].addr = &a; //ポインタの実体を代入
 info[index].data     = -1;
 info[index].sock     = -1;
 info[index].txEnable    = FALSE;
 info[index].addr->sin_familly  = AF_INET;
 info[index].addr->sin_port  = 0;
 info[index].addr->sin_addr  = 0;
}

int main(void){
 int i;
 
 printf("\nmain program start!!\n");

 for(i = 0;i < MAX_TASK;i++) {
  printf("before sock=%d\n",   info[i].sock);
  printf("before data=%d\n",   info[i].data);
  printf("before txEnable=%d\n",  info[i].txEnable);
  printf("before len=%d\n",   info[i].addr->sin_len);
  printf("before familly=%d\n",  info[i].addr->sin_familly);
  printf("before port=%d\n",   info[i].addr->sin_port);
  printf("before addr=%d\n",   info[i].addr->sin_addr);
  clearTcpTask(i);
  printf("after sock=%d\n",   info[i].sock);
  printf("after data=%d\n",   info[i].data);
  printf("after txEnable=%d\n",  info[i].txEnable);
  printf("after len=%d\n",   info[i].addr->sin_len);
  printf("after familly=%d\n",  info[i].addr->sin_familly);
  printf("after port=%d\n",   info[i].addr->sin_port);
  printf("after addr=%d\n",   info[i].addr->sin_addr);
 }
 return 0;
}

 

NULLを使ってコンパイルエラーが出る場合は、stddef.hをインクルードします。

sockaddr_inの実体を代入し忘れるとハマります。

 

実行結果です。

 

以上、ご利用下さい。(。・ω・)ノ゙

 

ポインタの復習からsockaddr_in構造体を使ってみる1へ

 

MENUに戻る