使用 writev() 发送数据,使用 readv() 接收数据
Send data using writev() , receive data using readv()
客户:
我已经使用 write()
从客户端 -> 服务器发送数据。
我需要确定服务器上的文件大小,这是 write(sockfd, buffer, strlen(buffer)
中的第 3 个参数。
我应该使用 writev()
将来自客户端 -> 服务器的数据作为单独的缓冲区发送吗? writev(sockfd, buffer, strlen(buffer))
?这是正确的方法吗?
write(sockfd, buffer, strlen(buffer));
服务器:
- 在服务器端,我正在使用
read()
读取数据。
- 我应该使用
readv()
- 获取文件大小吗?
没关系。 TCP 发送字节。您发送一些字节,更多字节和更多字节。它不知道缓冲区。缓冲区就是您告诉 TCP 发送哪些字节的方式。
当您将 writev 与 3 个缓冲区一起使用时,您是在告诉 TCP 发送第一个缓冲区中的字节,然后是第二个缓冲区中的字节,然后是第三个缓冲区中的字节。他们都加入了。就像你告诉它写一个大缓冲区一样。
如果你想一次发送两个东西(比如文件大小和文件数据)那么 writev 会更方便,或者不方便。请注意 writev 可以决定在任何缓冲区中的任何一点停止写入,并且您必须再次调用它才能写入其余部分。这样就不太方便了。
并且它也与服务器无关。允许服务器将字节读入一个缓冲区,如果第一个缓冲区已满,则允许读取第二个缓冲区,如果第二个缓冲区已满,则可以读取第三个缓冲区。或者它可以将它们读入一个大缓冲区。 TCP 不关心 - 无论哪种方式,它们都是相同的字节。
readv 和 writev 有同样的问题,它可能只读取前一个半缓冲区,而不是一次读取所有 3 个,然后你必须再次调用它并告诉它读取后半个缓冲区第二个缓冲区和整个第三个缓冲区。
客户:
我已经使用
write()
从客户端 -> 服务器发送数据。我需要确定服务器上的文件大小,这是
write(sockfd, buffer, strlen(buffer)
中的第 3 个参数。我应该使用
writev()
将来自客户端 -> 服务器的数据作为单独的缓冲区发送吗?writev(sockfd, buffer, strlen(buffer))
?这是正确的方法吗?write(sockfd, buffer, strlen(buffer));
服务器:
- 在服务器端,我正在使用
read()
读取数据。 - 我应该使用
readv()
- 获取文件大小吗?
没关系。 TCP 发送字节。您发送一些字节,更多字节和更多字节。它不知道缓冲区。缓冲区就是您告诉 TCP 发送哪些字节的方式。
当您将 writev 与 3 个缓冲区一起使用时,您是在告诉 TCP 发送第一个缓冲区中的字节,然后是第二个缓冲区中的字节,然后是第三个缓冲区中的字节。他们都加入了。就像你告诉它写一个大缓冲区一样。
如果你想一次发送两个东西(比如文件大小和文件数据)那么 writev 会更方便,或者不方便。请注意 writev 可以决定在任何缓冲区中的任何一点停止写入,并且您必须再次调用它才能写入其余部分。这样就不太方便了。
并且它也与服务器无关。允许服务器将字节读入一个缓冲区,如果第一个缓冲区已满,则允许读取第二个缓冲区,如果第二个缓冲区已满,则可以读取第三个缓冲区。或者它可以将它们读入一个大缓冲区。 TCP 不关心 - 无论哪种方式,它们都是相同的字节。
readv 和 writev 有同样的问题,它可能只读取前一个半缓冲区,而不是一次读取所有 3 个,然后你必须再次调用它并告诉它读取后半个缓冲区第二个缓冲区和整个第三个缓冲区。