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(概要)に書いてある。