将日期和时间作为 TCP 服务器欢迎消息发送

Sending date and time as a TCP server welcome message

我必须插入这段代码:

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

更改有人连接到服务器时显示的消息,从“Hello student!\n”更改为当前时间和日期,但我不知道将这两行代码复制到程序中的什么位置以及什么复制这两行后,我必须在代码中进行修改。

#include <stdio.h>      
#include <sys/types.h>
#include <sys/socket.h>   
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h> 

const char MESSAGE[] = "Hello student!\n";

int main(int argc, char *argv[]) {
    int simpleSocket = 0;
    int simplePort = 0;
    int returnStatus = 0;
    struct sockaddr_in simpleServer;
    
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <port>\n", argv[0]);
        exit(1);
    }

    simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (simpleSocket == -1) {
        fprintf(stderr, "Could not create a socket!\n");
        exit(1);
    }
    else {
        fprintf(stderr, "Socket created!\n");
    }

    /* retrieve the port number for listening */
    simplePort = atoi(argv[1]);

    /* setup the address structure */
    /* use INADDR_ANY to bind to all local addresses  */
    memset(&simpleServer, '[=11=]', sizeof(simpleServer)); 
    simpleServer.sin_family = AF_INET;
    simpleServer.sin_addr.s_addr = htonl(INADDR_ANY);
    simpleServer.sin_port = htons(simplePort);

    /*  bind to the address and port with our socket  */
    returnStatus = bind(simpleSocket,(struct sockaddr *)&simpleServer,sizeof(simpleServer));

    if (returnStatus == 0) {
        fprintf(stderr, "Bind completed!\n");
    }
    else {
        fprintf(stderr, "Could not bind to address!\n");
        close(simpleSocket);
        exit(1);
    }

    /* lets listen on the socket for connections      */
    returnStatus = listen(simpleSocket, 5);

    if (returnStatus == -1) {
        fprintf(stderr, "Cannot listen on socket!\n");
        close(simpleSocket);
        exit(1);
    }

    while (1)
    {
        struct sockaddr_in clientName = { 0 };
        int simpleChildSocket = 0;
        int clientNameLength = sizeof(clientName);

        /* wait here */
        simpleChildSocket = accept(simpleSocket,(struct sockaddr *)&clientName, &clientNameLength);

        if (simpleChildSocket == -1) {
            fprintf(stderr, "Cannot accept connections!\n");
            close(simpleSocket);
            exit(1);
        }

        /* handle the new connection request  */
        /* write out our message to the client */
        write(simpleChildSocket, MESSAGE, strlen(MESSAGE));
        close(simpleChildSocket);
    }

    close(simpleSocket);
    return 0;
}

感谢您的回答

一点介绍:关于原程序

程序开始创建套接字并将其设置为侦听特定端口,使用命令行作为参数传递给您的程序,例如 programName <port>.

端口号通过行 simplePort = atoi(argv[1]); 检索。本来可以对参数进行更严格的检查(atoi() 不检查是否实际提供了数字),但我认为对于入门级教育计划来说是可以的。


在那之后,随着行

simpleChildSocket = accept(simpleSocket,(struct sockaddr *)&clientName, &clientNameLength);

accept() 函数会阻塞,直到收到来自 TCP 客户端的连接请求。一旦 TCP 握手完成 (SYN / SYN-ACK / ACK, 它是 称为三次握手)一个套接字句柄被返回(在你的情况下simpleChildSocket)并且可以用来与客户端交换数据。


欢迎辞

接受完成后,我们确信一切顺利,我们很快就收到了我们的欢迎信息。随着行

/* write out our message to the client */
write(simpleChildSocket, MESSAGE, strlen(MESSAGE));

MESSAGE 字符串中包含的字符(用常量 const char MESSAGE[] = "Hello student!\n"; 定义)通过 write() 函数发送。它的参数是

  • 套接字描述符
  • 指向要发送的缓冲区的指针
  • 要发送的字节数(本例对应MESSAGE的长度,用strlen(MESSAGE)
  • 计算

注:write函数其实是可以用的,但是是非常规的选择。事实上,它是一个 general 函数,但在写入套接字时 send() 实际被使用。


如何实现你的目标

您所要做的就是用包含日期的字符串替换 write() 调用中的 MESSAGE

{
    char buff[30+1];
    time_t ticks = time(NULL);
    snprintf(buff, sizeof(buff), "%.30s\r\n", ctime(&ticks));

    /* write out our message to the client */
    write( simpleChildSocket, buff, strlen(buff) );
}

不要忘记定义您的 buff 字符缓冲区。我在本地定义了它,但你也可以动态分配它。

老师提供的代码复制了 buff 数组中 ctime() 的时间计算(我增加了它的大小以确保整个 datetime可以包含在里面)。

然后我们像以前一样调用 write,只是用新字符串 buffstrlen(buff).[=41 替换 MESSAGEstrlen(MESSAGE) =]

我解决了

#include <stdio.h>      
#include <sys/types.h>
#include <sys/socket.h>   
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h> 

/*const*/ char MESSAGE[100] = "";
char buff[100];

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

    int simpleSocket = 0;
    int simplePort = 0;
    int returnStatus = 0;
    struct sockaddr_in simpleServer;
    
    if (argc != 2) {

        fprintf(stderr, "Usage: %s <port>\n", argv[0]);
        exit(1);

    }

    simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (simpleSocket == -1) {

        fprintf(stderr, "Could not create a socket!\n");
        exit(1);

    }
    else {
        fprintf(stderr, "Socket created!\n");
    }

    /* retrieve the port number for listening */
    simplePort = atoi(argv[1]);

    /* setup the address structure */
    /* use INADDR_ANY to bind to all local addresses  */
    memset(&simpleServer, '[=10=]', sizeof(simpleServer)); 
    simpleServer.sin_family = AF_INET;
    simpleServer.sin_addr.s_addr = htonl(INADDR_ANY);
    simpleServer.sin_port = htons(simplePort);

    /*  bind to the address and port with our socket  */
    returnStatus = bind(simpleSocket,(struct sockaddr *)&simpleServer,sizeof(simpleServer));

    if (returnStatus == 0) {
        fprintf(stderr, "Bind completed!\n");
    }
    else {
        fprintf(stderr, "Could not bind to address!\n");
    close(simpleSocket);
    exit(1);
    }

    /* lets listen on the socket for connections      */
    returnStatus = listen(simpleSocket, 5);

    if (returnStatus == -1) {
        fprintf(stderr, "Cannot listen on socket!\n");
    close(simpleSocket);
        exit(1);
    }

    while (1)

    {

        struct sockaddr_in clientName = { 0 };
    int simpleChildSocket = 0;
    int clientNameLength = sizeof(clientName);

    /* wait here */

        simpleChildSocket = accept(simpleSocket,(struct sockaddr *)&clientName, &clientNameLength);

    if (simpleChildSocket == -1) {

            fprintf(stderr, "Cannot accept connections!\n");
        close(simpleSocket);
        exit(1);

    }

    /* handle the new connection request  */
    /* write out our message to the client */
    
    time_t ticks = time(NULL);
    snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
    strcpy(MESSAGE, buff);
    write(simpleChildSocket, MESSAGE, strlen(MESSAGE));
        close(simpleChildSocket);
    }

    close(simpleSocket);
    return 0;

}