基本TCPソケット2−2
accept関数
TCPサーバーはacceptを用いて確立済みコネクションキューの先頭から、接続完了している次のコネクションを取り出す。確立済みコネクションキューが空の場合、プロセスはスリープ状態におかれる(ブロッキングソケットの場合)。
#include <sys/socket.h> int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen); 戻り値:成功なら非負のディスクリプタ、エラーなら-1
acceptが成功した場合、その戻り値はカーネルが新規に作成した、クライアントとのTCPコネクションを参照しているディスクリプタ。
クライアントから接続を受け付けた時刻をコンソールに表示するプログラム
以下のコマンドでサーバーに接続する
telnet
#include <time.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #define MAXLINE 64 int main(int argc, char **argv) { int listenfd, connfd; socklen_t len; struct sockaddr_in servaddr, cliaddr; char buff[MAXLINE]; time_t ticks; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(8001); bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); listen(listenfd, 64); for (;;) { len = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &len); printf("connection from %s port %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)), ntohs(cliaddr.sin_port)); ticks = time(NULL); snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks)); write(connfd, buff, strlen(buff)); close(connfd); } return 0; }
コンパイル: gcc -o daytime daytime.c
実行: ./daytime
参考文献