网络编程--C/S日期查询例子

日期查询服务器--把当前日期和时间以ASCII格式通过套接字发送给客户端。

#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <unistd.h>

/* MAX_BUFFER为最大缓冲区容量 */
#define MAX_BUFFER          128
/* 套接字使用的端口号 */
#define DAYTIME_SERVER_PORT 13

int main()
{
    /* 两个套接字描述符 */
    int serverFd, connectionFd;
    /* 套接字地址结构体 */
    struct sockaddr_in servaddr;
    /* 暂时保存时间字符串所需的缓冲区 */
    char timebuffer[MAX_BUFFER+1];
    /* 用来描述时间的结构体 */
    time_t currentTime;
    
    /* 第一步使用socket函数创建套接字,其中AF_INET指明要创建一个IP套接字,SOCK_STREAM表明使用高可靠性的流协议,0表示默认的流类型协议即TCP协议 */
    serverFd = socket(AF_INET, SOCK_STREAM, 0); 
    
    /* 初始化地址结构,并将其元素设置为零 */
    memset(&servaddr, 0, sizeof(servaddr));
    
    /* 再次用AF_INET指明位IPv4套接字 */
    servaddr.sin_family = AF_INET;
    /* s_addr指定一个地址,这里是套接字建立连接后接受输入的地址。INADDR_ANY指明接受来自主机的任何可用接口的连接 */
    /* 这里右端也可以用inet_addr(INADDR_ANY) */
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    /* 定义将要使用的端口 */
    servaddr.sin_port = htons(DAYTIME_SERVER_PORT);
    /*其中,htonl()和htons()进行字节顺序转换保证提交到网络的包中字节是正确的 */ 

    /* 把前面创建的地址结构体和套接字绑定 */
    bind(serverFd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    
    /* 必须调用listen函数,客户端才能够连接到这个套接字。这个函数告诉协议栈已经准备好接受连接,参数5指定等待连接的客户队列中最多有5个客户 */
    listen(serverFd, 5);
/* 接受客户端连接并提供当前时间 */
    while(1)
    {   
        /* 对套接字serverFd调用accept函数,以同意建立新的客户连接 */
        connectionFd = accept(serverFd, (struct sockaddr *)NULL, NULL);
        /* 当一个客户连接到服务器的时候, 网络栈会创建一个描述连接终点的新的套接字,并有accept返回此套接字*/
        if(connectionFd >= 0)
        {
            /* time()函数获取当前时间,从1970.1.1开始的总秒数 */
            currentTime = time(NULL);
            /* ctime()将时间转换成可阅读的形式 */
            snprintf(timebuffer, MAX_BUFFER, "%s\n", ctime(&currentTime));
            /*使用write函数通过connectionFd套接字把这个回应字符串发送到相应的客户端 */
            write(connectionFd, timebuffer, strlen(timebuffer));
            /* 关闭客户套接字,结束通信 */
            close(connectionFd);
        }
    }
}
日期查询客户端

#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>

#define MAX_BUFFER          128
#define DAYTIME_SERVER_PORT 13

int main()
{
    int connectionFd, in , index = 0, limit = MAX_BUFFER;
    struct sockaddr_in servaddr;
    char timebuffer[MAX_BUFFER+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("127.0.0.1");

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

    while((in = read(connectionFd, &timebuffer[index], limit)) > 0)
    {   
        index += in; 
        limit -= in; 
    }   
    timebuffer[index] = 0;
    printf("\n%s\n", timebuffer);

    close(connectionFd);

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值