关于读取套接字的返回值

时间:2018-03-22 11:57:14

标签: c linux sockets unix network-programming

我最近正在学习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进行调试。 搜索读取返回0的最常见原因是客户端关闭连接。但telnet在阅读之前没有关闭连接。 为什么读取返回0? 如何修改代码以解决此问题? 我的操作系统是Ubuntu 16.04。

1 个答案:

答案 0 :(得分:1)

str_echo中有一个拼写错误:

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

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

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