gpt4 book ai didi

c++ - C++服务器编程

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:26 24 4
gpt4 key购买 nike

我想用 c/c++ 中的 win socket 制作一个聊天程序。 (我完全是新手。)第一个问题是关于如何检查客户端是否收到来自服务器的数据包。例如,服务器向客户端发送“aaaa”。如果客户端没有收到数据包“aaaa”,服务器应该再次重新发送数据包。(我认为)。但是,我不知道如何检查它。这是我的思想打击。第一个案例。


服务器 --- "aaaa"---> 客户端。
服务器将检查某种时间等待来自客户端的确认消息。
客户端---“我收到了”--->服务器。
服务器不会重新发送数据包。


另一种情况。
服务器---“aaaa”--->客户端。
服务器正在等待客户端消息直到超时
服务器 --- "aaaa"---> 客户端。

但这些可能是不合适的。再看第二种情况。服务器正在等待来自客户端的消息一段时间。如果超时,服务器将再次重新发送数据包。在这种情况下,客户端可能会收到两次数据包。

第二个问题是如何发送无限大小的数据包。一本书说数据包应该有类型、大小和消息。接下来,我只能发送特定大小的消息。但我想发送 1Mbytes 或更多的消息。(无限制)

怎么做?

任何人都有任何好的链接或尽可能简单地向我解释正确的逻辑。

谢谢。

最佳答案

使用 TCP。在应用程序级别考虑“消息”,而不是数据包。

TCP 已经处理网络级数据包数据、错误检查和重新发送丢失的数据包。它将此作为字节“流”呈现给应用程序,但不一定保证交付(因为任何一端都可以强制断开连接)。

因此,在应用程序级别,您需要处理消息接收和缓冲——重新连接的客户端能够请求以前的消息,但它们(还)没有正确接收到这些消息。

下面是一些数据结构:

class or struct Message {
int type; // const MESSAGE.
int messageNumber; // sequentially incrementing.
int size; // 4 bytes, probably signed; allows up to 2GB data.
byte[] data;
}

class or struct Receipt {
int type; // const RECEIPT.
int messageNumber; // last #, successfully received.
}

您可能还需要一次连接/问候,也许还需要一次断开/再见握手。

class Connect {
int type; // const CONNECT.
int lastReceivedMsgNo; // last #, successfully received.
// plus, who they are?
short nameLen;
char[] name;
}

等等

如果您可以非常简单并且不需要缓冲/重新发送消息给重新连接的客户端,那就更简单了。

您还可以采用“统一消息结构”,将 TYPE 和 SIZE(4 字节整数)作为每条消息或握手的前两个字段。这可能有助于标准化您处理这些问题的例程,但代价是一些冗余(例如,“名称”字段大小)。

关于c++ - C++服务器编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18070829/

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