迭代服务器编程

来源:互联网 发布:在职软件工程硕士2017 编辑:程序博客网 时间:2024/04/29 06:25
 

 下面代码实现的是典型的迭代服务器框架,服务器端功能是为客户端提供日期服务。

(1) 服务器端代码

dayserv.c源代码如下:

#include <stdio.h>

#include <string.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <time.h>

#include <unistd.h>

#define MAX_BUFFER      128

#define DAYTIME_SERVER_PORT 8001

int main ( void )

{

    int serverFd, connectionFd;

    struct sockaddr_in servaddr;

    char timebuffer[MAX_BUFFER+1];

    time_t currentTime;

    serverFd = socket(AF_INET, SOCK_STREAM, 0);

    memset(&servaddr, 0, sizeof(servaddr));

    servaddr.sin_family = AF_INET;

    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    servaddr.sin_port = htons(DAYTIME_SERVER_PORT);

    bind(serverFd, (struct sockaddr *)&servaddr, sizeof(servaddr));

    listen(serverFd, 5);

    while ( 1 ) {

        connectionFd = accept(serverFd, (struct sockaddr *)NULL, NULL);

        if (connectionFd >= 0) {

            currentTime = time(NULL);

            snprintf(timebuffer, MAX_BUFFER, "%s\n", ctime(&currentTime));

            write(connectionFd, timebuffer, strlen(timebuffer));

            close(connectionFd);

        }

    }

    return 0 ;

}

(2)客户端代码

daycli.c源代码如下:

#include <stdio.h>

#include <string.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <unistd.h>

#include <time.h>

#define MAX_BUFFER      128

#define DAYTIME_SERVER_PORT 8001

int main ( int argc, char *argv[] )

{

    int connectionFd, in;

    struct sockaddr_in servaddr;

    char timebuffer[MAX_BUFFER+1];

    if (argc != 2) {

        fprintf(stderr, "Usage:./daycli IP\n") ;

        return -1;

    }

    connectionFd = socket(AF_INET, SOCK_STREAM, 0);

    memset(&servaddr, 0, sizeof(servaddr));

    servaddr.sin_family = AF_INET;

    servaddr.sin_port = htons(DAYTIME_SERVER_PORT);

    servaddr.sin_addr.s_addr = inet_addr(argv[1]) ;

    connect(connectionFd, (struct sockaddr *)&servaddr, sizeof(servaddr));

    while ( (in = read(connectionFd, timebuffer, MAX_BUFFER)) > 0) {

        timebuffer[in] = 0;

        printf("\n%s", timebuffer);

    }

    close(connectionFd);

    return 0;

}

(3)编译与执行

编译服务端代码 gcc dayserv.c -o dayserv。

编译客户端代码 gcc daycli.c -o daycli。

执行 ./dayserv &, ./daycli 127.0.0.1,执行结果如下:

Fri Jan 16 14:20:21 2009

 

摘录自《深入浅出Linux工具与编程》

原创粉丝点击