繁体   English   中英

通过套接字发送数据时,ENOENT是什么意思?

[英]What does ENOENT mean when sending data over a socket?

我正在研究一些嵌入式C代码,这些代码通过HTTP协议将数据发布到网站。 前一个字节运行良好,在1024个字节的缓冲区中分块。 但是,最后, send()调用失败,并出现errno=2 (ENOENT)。 我在联机帮助页中找不到此错误,所以我不知道出了什么问题。 我的HTTP POST标头说

Content-Length: 12517

这是我要发送的确切字节数(这是原始文件)。

这是我的代码( sockfd是正确打开的套接字):

void send_all_n(int sockfd, char *buf, int buf_len) {
    int bytes_sent = 0;
    char *buf_ptr = buf;
    int failed = 0;

    do {
        bytes_sent = send(sockfd, buf_ptr, buf_len-bytes_sent, 0);
        if (bytes_sent > 0) {
            buf_ptr += bytes_sent;
        } else if (bytes_sent == -1) {
            switch(errno) {
                case EWOULDBLOCK:
                    usleep(100000);
                    break;
                default:
                    failed = 1;
                    break;
            }
        }
    } while (bytes_sent < buf_len && failed == 0);
}

许多1024字节的缓冲区运行良好,直到最后某个地方,我的日志记录如下:

2014-04-09 18:13:31 +0800 [D]: [network] wrote 328 bytes to host, buf_len=1024, bytesleft=696
2014-04-09 18:13:31 +0800 [D]: [network] wrote -1 bytes to host, buf_len=1024, bytesleft=1025
2014-04-09 18:13:31 +0800 [S]: [network] could not send data: errno=2

更新 :如果我在两次发送缓冲区之间增加了1秒钟的睡眠,则可以正常工作。

您确定在send()失败和记录它的调用之间没有调用更改errno的问题吗?

至少为了调试,我将perror("send() failed")switch()default情况下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM