[英]What does "send data to" a socket mean in this part of Beej's guide?
[英]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.