使用linux中的send()函数发送数据

时间:2014-11-29 10:07:36

标签: c linux sockets send

我读到有关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....?

谢谢!

2 个答案:

答案 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字节类型的指针。)