0

2 つのサーバー コードがあります。

  1. 最初のサーバー: 文字列が終了するまで毎回クライアントに文字を送信します

    int
    main(int argc, char **argv)
    {
        int                 listenfd, connfd;
        struct sockaddr_in  servaddr;
        char                buff[MAXLINE];
        time_t              ticks;
            char                            temp[1];
            int                             i = 0;
    
        listenfd = Socket(AF_INET, SOCK_STREAM, 0);
    
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family      = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port        = htons(9999); /* daytime server */
    
        Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
    
        Listen(listenfd, LISTENQ);
    
        for ( ; ; ) {
            connfd = Accept(listenfd, (SA *) NULL, NULL);
    
            ticks = time(NULL);
            snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
    
            for(i = 0; i < strlen(buff); i++)
            {
                temp[0] = buff[i];
                Write(connfd, temp, strlen(temp));
            }
    
            Close(connfd);
        }
    }
    
  2. 2 番目のサーバー: クライアントに文字列を送信します

    int
    main(int argc, char **argv)
    {
        int                 listenfd, connfd;
        struct sockaddr_in  servaddr;
        char                buff[MAXLINE];
        time_t              ticks;
            char                            temp[1];
            int                             i = 0;
    
        listenfd = Socket(AF_INET, SOCK_STREAM, 0);
    
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family      = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port        = htons(9999); /* daytime server */
    
        Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
    
        Listen(listenfd, LISTENQ);
    
        for ( ; ; ) {
            connfd = Accept(listenfd, (SA *) NULL, NULL);
    
            ticks = time(NULL);
            snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
    
            Write(connfd, buff, strlen(buff));
            Close(connfd);
        }
    }
    
  3. クライアント:サーバーから送信された文字を受信します

    int
    main(int argc, char **argv)
    {
        int                 sockfd, n;
        char                recvline[MAXLINE + 1];
        struct sockaddr_in  servaddr;
            int count = 0;
    
        if (argc != 2)
            err_quit("usage: a.out <IPaddress>");
    
        if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
            err_sys("socket error");
    
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port   = htons(9999);  /* daytime server */
        if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
            err_quit("inet_pton error for %s", argv[1]);
    
        if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
            err_sys("connect error");
    
        while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
            recvline[n] = 0;    /* null terminate */
                    count++;
            if (fputs(recvline, stdout) == EOF)
                err_sys("fputs error");
        }
        if (n < 0)
            err_sys("read error");
            printf("read time:%d\n", count);
    
        exit(0);
    }
    

結果は両方とも変数 count の出力が 1 です。私の質問は、最初のサーバーの出力が 1 である理由です。最初のサーバーの結果は strlen(buff) である必要があると思います。

PS: サーバーとクライアントを同じマシンで実行しています。

4

1 に答える 1