我读到有关send()
函数的文档,当时有人说第三个参数(len
)是“buf参数指向的缓冲区中数据的长度,以字节为单位”
我似乎无法理解它是否发送了我传递的字节数,或者我需要传递缓冲区的大小并发送包含在那里的所有数据。
〔实施例:
#define X 256
// main :
char test[X] = {0};
memcpy(test, "hello", 6);
send(sockfd, test, 6, 0)
send(sockfd, test, 256,0)
// will the first opetion send only hello? or hello000000....?
谢谢!
答案 0 :(得分:2)
send
函数精确地发送您告诉它的字节数(假设它没有中断,否则不会失败)。您需要发送的字节数由您正在实施的协议决定。例如,如果协议说你应该发送" FOO \ r \ n",那么你需要发送5个字节。如果协议指定整数以网络字节顺序表示为4个字节并且您正在发送整数,则缓冲区应包含网络字节顺序的整数,并且您应该发送4个字节。缓冲区的大小与send
无关。
答案 1 :(得分:1)
作为David Schwartz正确答案的补充:
根据套接字是否为非阻塞, NOT 保证单个send
实际发送所有数据。您必须检查返回值,并且可能必须再次调用send(具有正确的缓冲区偏移量)。
例如,如果要发送10个字节的数据(len = 10),则调用send(sock, buf, len, 0)
。但是,假设它只设法发送5个字节,那么send(..)
将返回5,这意味着您必须稍后再次调用它,如send(sock, (buf + 5), (len - 5), 0)
。意思是,跳过缓冲区中的前五个字节,它们已经被发送,并从我们想要发送的总字节数(len)中提取五个字节。
(请注意,我使用括号使其更易于读取,并假设buf
是指向1字节类型的指针。)