第 1 章:简介

基本的时间服务器和客户端构建。

服务器代码:

#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <netinet/in.h>
#include <stdlib.h>

#define MAXLINE (4096)
#define LISTENQ (1024)

int 
main(int argc, char *argv[])
{
    int listenfd, connfd;
    struct sockaddr_in servaddr;
    char buff[MAXLINE];
    time_t ticks;

    listenfd = 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(13);

    if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
        perror("bind error");
        exit(1);
    }

    if (listen(listenfd, LISTENQ) == -1) {
        perror("listen error");
        exit(2);
    }

    printf("time server start working!\n");

    while (1) {

        if ((connfd = accept(listenfd, (struct sockaddr *)NULL, NULL)) == -1) {
            perror("accept error");
            exit(3);
        }

        ticks = time(NULL);

        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));

        if (write(connfd, buff, strlen(buff)) == -1) {
            perror("write error");
            exit(4);
        }

        close(connfd);
    }
}

运行服务器:

$ sudo ./daytimetcpsrv
time server start working!

客户端代码:

#include <sys/types.h>  // socket
#include <sys/socket.h> // socket
#include <stdio.h>  // printf
#include <stdlib.h> // exit
#include <string.h> // bzero
#include <arpa/inet.h>  // htons, inet_pton

#define MAXLINE (4096)

int
main(int argc, char *argv[])
{
    int sockfd, n;
    char recvline[MAXLINE + 1];
    struct sockaddr_in servaddr;

    if (argc != 2) {
        fprintf(stderr, "usage: a.out <IPaddress>\n");
        exit(1);
    }

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("socket error");
        exit(2);
    }

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

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(13);

    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {
        fprintf(stderr, "inet_pton error for %s\n", argv[1]);
        exit(3);
    }

    if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
        perror("connect error");
        exit(4);
    }

    while ((n = read(sockfd, recvline, MAXLINE)) > 0) {

        recvline[n] = '\0';

        if (fputs(recvline, stdout) == EOF) {
            fprintf(stderr, "fputs error\n");
            exit(5);
        }
    }

    if (n < 0) {
        perror("read error\n");
        exit(6);
    }

    exit(0);
}

运行客户端:

$ ./daytimetcpcli 127.0.0.1
Tue Jun 25 11:52:54 2013

留言

comments powered by Disqus

Previous topic

《Unix 网络编程》笔记

Next topic

第 2 章:传输层:TCP 、 UDP 和 SCTP