課題2メモ。
socket(int protocolfamily ,int type , intprotocol);
ソケットの作成。 失敗すると-1を返す
<int protocolfamily>
| PF_UNIX | ローカル通信 |
| PF_INET | IPv4 インターネット・プロトコル |
<int type>
| SOCK_STREAM | 順序性と信頼性があり、双方向の、接続されたバイト・ストリーム(bytestream)を提供 |
| SOCK_DGRAM |
データグラム(接続、信頼性無し、固定最大長メッセージ)をサポート |
| SOCK_SEQPACKET | 固定最大長のデータグラム転送パスに基づいた順序性、信頼性のある双方向の接続に基づいた通信を提供。受け取り側はそれぞれの読み出しシステム・コールごとにパケット全体を読み取ることを要求される。 |
| SOCK_RAW | 生のネットワーク・プロトコルへのアクセスを提供する |
| SOCK_RDM | 信頼性はあるが、順序は保証しないデータグラム層を提供する |
<int protocol>
| IPPROTO_TCP | プロトコルとしてTCPを使う |
| IPPROTO_UDP | プロトコルとしてUDPを使う |
int bind(int sockfd , struct sockaddr*myaddr , intaddrlen);
ソケットとポートの結合
<sockfd>
socket()で作成したsocket番号を入れる。
<struct sockaddr *myaddr>
実際に使うのは sockaddr_in構造体で、sockaddr型にキャストして使用する。
構成は以下の通り。
struct sockaddr_in{
unsigned short sin_family;//procotolfamily
unsigned short sin_port;//ポート番号
struct in_addr sin_addr;//IPアドレス
}
protocolfamilyは、socket()におけるprotocolfamilyと同じと考える。
使用するポート番号を、TCP/IPネットワークにおけるバイトオーダーに変換するためにuint16_thtons(uint16_tx) という関数を使用する。
また、使用するIPアドレスもTCP/IPネットワークにおけるバイトオーダーに変換するためにuint32_thtonl(uint32_t x)という関数を使用する。
| htons | 16ビット値をホストのバイト順からネットワークのバイト順に変換(リトル円ディアンからビッグエンディアンへ) |
| htonl | 32ビット値をホストのバイト順からネットワークのバイト順に変換(リトル円ディアンからビッグエンディアンへ) |
| uint16_t | 16ビット符号なし整数 |
| uint32_t | 32ビット符号なし整数 |
構造体を使用する前には
memset(&srcAddr , 0 , sizeof(srcAddr));
のように初期化すると良い。
int listen(int sockfd ,int backlog);
この関数はconnection-orientedなserverで使われ、
connectionを受け取ろうとしていることを示す。
これは socketと bindの関数の後、
accept関数の前に履行される。
backlog引数はacceptされる前にいくつのconnectionのリクエストを
待ち行列にいれるかを指定する。
その最大値は5であり、普通5が取られる。
int accept(int sockfd, structsockaddr *peer, intaddrlen);
clientから実際のconnectionが行なわれたら、
accept関数によって処理される。
acceptは待ち行列にある最初のconnectionを取ってきて
sockfdと同じ性質のもう一つのsocketを作り出す。(newsockfdを返す。)
connection requests がないときは、ブロックされる。
int connect(int sockfd, structsockaddr *servaddr, intaddrlen);
client プロセスはconnect 関数が server と結合を
確立することによってsocketにconnectする。
sockfd は(client側の) socket
関数によって返されたsocketdescriptorである。