Unix網路程式設計實踐:時間獲取伺服器程式
阿新 • • 發佈:2019-02-16
第二課
daytimetcpsrv.c程式原始碼如下:
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/types.h> #include <arpa/inet.h> #include <time.h> #define MAXLINE 256 #define LISTENQ 5 int main(int argc, char **argv) { int listenfd, connfd; struct sockaddr_in servaddr; char buff[MAXLINE]; time_t ticks; if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "Socket error:%s\n\a", strerror(errno)); exit(1); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(13); if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1) { fprintf(stderr, "Bind error:%s\n\a", strerror(errno)); exit(1); } if (listen(listenfd, LISTENQ) == -1) { fprintf(stderr, "Listen error:%s\n\a", strerror(errno)); exit(1); } for ( ; ; ) { if ( (connfd = accept(listenfd, (struct sockaddr *) NULL, NULL)) == -1) { fprintf(stderr, "Accept error:%s\n\a", strerror(errno)); } snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks)); if (write(connfd, buff, strlen(buff)) == -1) { fprintf(stderr, "Write error:%s\n\a", strerror(errno)); exit(1); } close(connfd); } }
編譯: gcc -o daytimetcpsrv daytimetcpsrv.c
執行生成的伺服器指令碼:sudo ./daytimetcpsrv
來檢視下伺服器現在的狀態吧:
1. ps aux | grep daytimetcpsrv (檢視程序是否執行)
2. sudo lsof -i:13 (檢視13埠是否被程序使用)
3. telnet 127.0.0.1 13 ,訪問此埠服務即可獲得伺服器時間,如下:Thu Jan 1 08:00:00 1970
4. 也可以用我們上一節的客戶端程式呼叫此伺服器服務, ./daytimetcpcli 127.0.01 , 獲得返回如下: Thu Jan 1 08:00:00 1970