我正在研究一些通过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秒睡眠,则可以正常工作。
答案 0 :(得分:0)
你确定在失败的errno
和记录它的电话之间有没有呼叫更改send()
吗?
至少在进行调试时,我要perror("send() failed")
switch()
default
案件添加{{1}}。