return-关于读取套接字的值

return-value about read a socket

最近在学习Unix网络编程。学完5.1~5.3就写一些玩具代码了

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <errno.h>
#define SERV_PORT 9877
#define MAXLINE 4096
#define LISTENQ 1024
void str_echo(int sockfd)
{
    puts("str_echo");
    size_t n;
    char buf[MAXLINE];
    int writebytes;
again:
    while((n == read(sockfd, buf, MAXLINE)) > 0)
        writebytes = write(sockfd, buf, n);
    printf("writebytes=%d n=%d\n", writebytes, (int)n);
    if(n < 0 && errno == EINTR)
        goto again;
    else if(n < 0)
        perror("str_echo"), exit(1);
}


int main()
{
    int listenfd, connfd;
    pid_t childpid;
    socklen_t clilen;
    struct sockaddr_in cliaddr, servaddr;
    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(SERV_PORT);
    bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
    listen(listenfd, LISTENQ);
    for(;;){
        puts("in loop");
        clilen = sizeof(cliaddr);
        connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);
        /*char ipa[100];
        printf("ip address=%s\n", inet_ntop(AF_INET, &cliaddr.sin_addr, ipa, 50));*/
        if((childpid = fork()) == 0){
            printf("connfd=%d\n",connfd);
            puts("in if");
            close(listenfd);
            str_echo(connfd);
            exit(0);
        }
        close(connfd);
    }
}

当我使用telnet测试代码时:

telnet 127.0.0.1 9877

我输入'nihao',输出是:

Trying 127.0.0.1...
in loop
Connected to 127.0.0.1.
Escape character is '^]'.
connfd=4
in if
str_echo
nihao
writebytes=0 n=0
Connection closed by foreign host.

请告诉我这有什么问题。 我想添加一些 printf 用于调试。 搜索 read-returning-0 的最常见原因是客户端关闭连接。但是 telnet 在读取之前没有关闭连接。 为什么读returns0? 我怎样才能修改我的代码来解决这个问题? 我的操作系统是 Ubuntu 16.04.

str_echo中有错别字:

while((n == read(sockfd, buf, MAXLINE)) > 0)

==是比较。你想做一个任务。更改为:

while((n = read(sockfd, buf, MAXLINE)) > 0)