gpt4 book ai didi

c - SOCK_SEQPACKET Unix 套接字上的空包

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

我在 Unix 套接字上使用 SOCK_SEQPACKET 类型。

我用来阅读的代码是经典的

ssize_t recv_size = recv(sd, buffer, sizeof(buffer), 0);
if (recv_size < 0) {
handle_error("recv", errno);
} else if (recv_size > 0) {
handle_packet(buffer, recv_size);
} else {
// recv_size == 0 => peer closed socket.
handle_end_of_stream();
}

虽然这工作得很好,但我注意到它无法区分套接字闭包和大小为 0 的消息。换句话说,如果在另一端我发出这样的调用序列:

send(sd, "hello", strlen("hello"), 0);
send(sd, "", 0, 0);
send(sd, "world", strlen("world"), 0);

…读者将只会收到"hello" 并通过套接字关闭对第二条消息使用react,完全错过"world" 消息。

我想知道是否有某种方法可以消除这两种情况之间的歧义。

最佳答案

如果你在两端做一些“确认”功能呢?例如,代替 handle_end_of_stream,做这样的事情:

->send(xx, "UNIQUE_MESSAGE", strlen("UNIQUE_MESSAGE"), 0);

<如果连接仍然有效,您会收到“UNIQUE_RESPONSE”,如果没有,您可以确定另一端已关闭。只需在您的“确认”功能中过滤掉某种“UNIQUE_MESSAGE”和“UNIQUE_RESPONSE”。

关于c - SOCK_SEQPACKET Unix 套接字上的空包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51467936/

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