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

时间:2014-04-09 10:29:35

标签: c sockets networking

我正在研究一些通过HTTP协议将数据发布到网站的嵌入式C代码。第一个字节顺利,在1024字节缓冲区中分块。但最后,send()调用失败并显示errno=2(ENOENT)。我在manpage中找不到这个错误,所以我不知道出了什么问题。我的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秒睡眠,则可以正常工作。

1 个答案:

答案 0 :(得分:0)

你确定在失败的errno和记录它的电话之间有没有呼叫更改send()吗?

至少在进行调试时,我要perror("send() failed") switch() default案件添加{{1}}。