2010年10月5日火曜日

TCP ACCEPT関数

accept - ソケットへの接続を受ける


struct sockadd_in の実装は以下の通り。
struct sockaddr_in {
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
};

/* Internet address. */
struct in_addr {
    uint32_t       s_addr;     /* address in network byte order */
};

ここで、inet_ntoa()関数を使用して sockaddr_in 構造体から IP アドレスを表示させる実装は、以下のようになる。
printf("IP = %s\n", inet_ntoa(client.sin_addr));

ただし、次のヘッダーファイルをインクルードしなければ、表示されないので注意!
<arpa/inet.h>
数値としてIPアドレスを操作する機能の定義

参考:
ACCEPT

ソケット(BSD)

TCP

TCPとは、以下のことを言う。
Transmission Control Protocol(トランスミッション コントロール プロトコル、TCP)
セッションという形で1対1の通信を実現し、パケットシーケンスチェックによる欠損パケット再送などのエラー訂正機能などを持ち、データ転送などの信頼性の必要な場面でよく使用される。一方他のトランスポート層プロトコルに比べ、プロトコル上のオーバヘッドが大きい為、比較的低速となる。

サーバー側の実装は以下の手順で行う。
1.
socket(2) でソケットを作成する。
2.
bind(2) を使ってソケットにローカルアドレスを割り当てて、 他のソケットがこのソケットに connect(2) できるようにする。
3.
listen() を使って、接続要求を受け付ける意志と接続要求を入れるキュー長を指定する。
4.
accept(2) を使って接続を受け付ける。

参考:
Transmission Control Protocol(TCP)

LISTEN

2010年10月4日月曜日

ctrl-c で強制終了

無限ループ等で処理が終わらなくなった場合、次のやり方で処理を止める。
ctrl-c
これをすれば、処理は強制終了する。

memset関数で出たwarning

char型配列 buf[] を「0」で埋めるため、以下の処理を書いたら warning が発生した。
memset(buf, 0, sizeof(buf));
warning: incompatible implicit declaration of built-in function ‘memset’
対処方法
→ #include<string.h> しましょう!!!
man memset を見れば、SYNOPSIS(概要)に書いてある。

2010年9月22日水曜日

Day6 Reaction Time(3)信号機画像を追加する

信号機ケーブル画像を追加する
画像をプログラミングで、表示したい位置に追加するために以下のように実装した。

UIImage* stopLightCableImage = [UIImage imageNamed:@"stopLightCable.png"];
 UIImageView* stopLightCableView = [[UIImageView alloc] initWithImage:stopLightCableImage];
 stopLightCableView.frame = CGRectMake(150, 0, stopLightCableImage.size.width, stopLightCableImage.size.height);
 stopLightCableView.image = stopLightCableImage;
 [self.view addSubview:stopLightCableView];

2行目
initWithImage メソッドで指定した画像で初期化する。

3行目
UIImageView の frame メソッドで表示位置を指定する。
→ bounds メソッドでは、stopLightCableView の、ローカルな座標の指定になるので間違い。frame メソッドで、親Viewから見た座標で位置を指定する。


4行目
image プロパティに画像を指定する。

信号機画像3種類をランダムに表示させるメソッドを実装する

以下の内容を訂正する。これではやりたかったことが実現できないので。。
訂正ここから-----------------------------------
以下のように実装した。
-(NSArray *)makeAnimationImagesArray{

 NSMutableArray* trafficLightArray = [NSMutableArray arrayWithObjects:
         [UIImage imageNamed:@"redLightSmall.png"],
         [UIImage imageNamed:@"yellowLightSmall.png"],
         [UIImage imageNamed:@"greenLightSmall.png"], nil];

 int count = [trafficLightArray count];
 srand([[NSDate date] timeIntervalSinceReferenceDate]);
 
 int i = 0;
 for(i=0; i<10; i++){
  NSUInteger pos1 = rand() % count;
  NSUInteger pos2 = rand() % count;
  
  [trafficLightArray exchangeObjectAtIndex:pos1 withObjectAtIndex:pos2];
 }
 
 return(trafficLightArray);
}
9行目 擬似乱数の発生系列を変更する種を、現在時刻から生成する。
10行目〜 0〜2をランダムに生成する。 訂正ここまで-----------------------------------


改めて、 信号機画像3種類を表示させる
次のメソッドを使用して、現行ループにタイマーとスケジュールを作成する。
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
Creates and returns a new NSTimer object and schedules it on the current run loop in the default mode.
このメソッドで、3種類の画像(黄→赤→緑)を3秒おきに表示させる。
アクセルペダルをタップした時の動作を実装する 事前にフラグを持たせておいて、緑色画像が表示されたらフラグをONにする。また、その時の時刻を取得しておく。
次のメソッドを使用して、緑色画像が表示された時刻と、現在時刻の差を取得する。
timeIntervalSinceNow
Returns the interval between the receiver and the current date and time.

結果をUIAlertView で画面に表示する。

frame と boundsとcenter の関係

ビューオブジェクトである、frame,bounds,center は以下のように定義されている。
frame(フレーム)プロパティは、親ビューの座標系に基づいて、そのビューの
位置とサイズを定義した矩形(フレーム矩形)を表します。
フレーム矩形は、boundsとcenterを使用して計算される便利な値です。これは、ビューの変換が、恒等変換に設定されている場合にのみ有効です。
bounds(境界)プロパティは、ビュー固有のローカルな座標系に基づいて、ビューの位置とサイズを定義した矩形(境界矩形)を表します。境界矩形の原点は、通常(0, 0)に設定されますが、必ずしもその必要はありません。
境界矩形は、そのビューのローカルな座標系を表すので、描画やイベント処理のコードの中で、何らかの変化がビュー内のどこで発生したかを知る必要があるときに、最もよく使います。
center(中心)プロパティは、フレーム矩形の中心点を表します。
中心点は、ビューの既知の中心点を表すので、ビューの位置を操作するのに最適な方法です。
----------------------------------------
frame と bounds の関係













参考PDF:
iPhone アプリケーションプログラミングガイド
Stanford University / CS 193P iPhone Apprication Development / Title: Lecture #5 - Views, Drawing, Animation

2010年9月17日金曜日

Day6 Reaction Time(2)view に背景画像を追加する

背景画像として、road.png をview に追加する。
road.png をResources フォルダに追加して、以下のように実装した。

- (void)viewDidLoad {
    [super viewDidLoad];

 UIImage* backgroundImage = [UIImage imageNamed:@"road.png"];
 UIImageView* backgroundView = [[UIImageView alloc] initWithImage:backgroundImage];
 [backgroundView setFrame:[[UIScreen mainScreen] bounds]];
 [self.view addSubview:backgroundView];
 
 [backgroundView release]; 
}

参考にしたのは以下の箇所。
How do I create a view for images?
To create a view for images, use the UIImageView class, as shown in Listing 14.

Listing 14: Creating a view for images
UIImage *image = [UIImage imageNamed:@"image.png"];
UIImageView *theImageView = [[UIImageView alloc] initWithImage:image];
さらに、UIImageView を setFrame メソッドで画面全体に表示させて、view に追加している。

参考サイト:

User Experiense Coding How-To's