Unix网络编程实践:时间获取服务器程序

本文介绍了一个简单的TCP服务器程序daytimetcpsrv.c的实现过程,包括源码解析、编译及运行步骤。该服务器能够接收客户端连接请求并返回当前服务器时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二课


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值