gpt4 book ai didi

c - 当没有一次性发送完整消息时,在套接字上使用 send() 的正确方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 05:32:22 25 4
gpt4 key购买 nike

我正在编写一个简单的 C 服务器,有时可能无法发送或接收完整的消息。我看过the beej guidelinux man page在其他资源中。当需要多次发送和接收调用时,我无法弄清楚如何发送和接收。这是我尝试发送的内容:

char* buffer [4096];
int client_socket, buffer_len, message_len, position;
....
while (position < message_len) {
position = send(client_socket, buffer, message_len, 0);
}

我不确定我是否应该这样做或者..

while (position < message_len) {
position = send(client_socket, buffer+position, message_len-position, 0);
}

文档没有解决这个问题,我找不到在 while 循环内发送的用法示例。一些 C 函数可以跟踪函数调用之间的状态(例如 strtok),但我不确定 send 是否可以。我不想做的是从消息的开头重复发送,直到一次完成。

我有必要一次发送最大 50MB 的文件,因此在这种情况下可能会有多个调用要发送。

最佳答案

send() 返回发送的字节数,如果发生错误则返回 -1。如果您跟踪已发送的字节数,则可以将其用作发送缓冲区中的偏移量。剩余待发送的消息长度当然会减少相同的数量。

int bytes_sent_total = 0;
int bytes_sent_now = 0;
while (bytes_sent_total < message_len)
{
bytes_sent_now = send(client_socket, &buffer[bytes_sent_total], message_len - bytes_sent_total, 0);
if (bytes_sent_now == -1)
{
// Handle error
break;
}
bytes_sent_total += bytes_sent_now;
}

关于c - 当没有一次性发送完整消息时,在套接字上使用 send() 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57740245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com