关于读取套接字的返回值

jl0x61

我最近在学习 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 在读取之前没有关闭连接。为什么读取返回0?如何修改我的代码来解决这个问题?我的操作系统是 Ubuntu 16.04。

克拉斯·林德贝克

有一个错字str_echo

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

==是一个比较。你想做一个作业。改成:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

套接字accept()后无法获取返回值

来自分类Dev

函数套接字close()方法的返回值“ -1”是否可能?

来自分类Dev

从块读取返回值

来自分类Dev

关于输出的返回值的问题

来自分类Dev

关于getTime()的返回值的问题

来自分类Dev

通过Java套接字返回多个值

来自分类Dev

使用javassist读取方法的返回值

来自分类Dev

关于STDIN,STDOUT,STDERR和返回值

来自分类Dev

关于Enum.GetValues()的返回值的困惑

来自分类Dev

关于 Integer.toString(char) 的返回值

来自分类Dev

从C读取套接字

来自分类Dev

从套接字读取数据

来自分类Dev

从C读取套接字

来自分类Dev

从套接字读取问题

来自分类Dev

快速从套接字获取IP地址返回奇怪的值

来自分类Dev

套接字不断返回双字符串值

来自分类Dev

如何使RobotFramework关键字的Execute JavaScript返回值

来自分类Dev

robotframework混合库关键字不会返回值

来自分类Dev

将参数传递给方法并读取返回值?

来自分类Dev

从管道读取:如何处理c中的返回值?

来自分类Dev

如何从Ajax读取Google图表的数据数组返回值?

来自分类Dev

如何通过httpresponse读取以获取返回值:

来自分类Dev

Qt读取ini文件不返回值

来自分类Dev

将参数传递给方法并读取返回值?

来自分类Dev

在JS中读取JSF操作方法的返回值

来自分类Dev

如何从 C# 中的 Async 方法读取返回值?

来自分类Dev

从Linux套接字读取“ varint”

来自分类Dev

从套接字读取n秒钟

来自分类Dev

套接字读取/监视文件?