1. 程式人生 > >Unix網路程式設計實踐:時間獲取伺服器程式

Unix網路程式設計實踐:時間獲取伺服器程式

第二課

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