C++ C++;
我想用c/c++中的WinSocket制作一个聊天程序。(我完全是新手。) 第一个问题是关于如何检查客户端是否从服务器接收数据包。 例如,服务器向客户端发送“aaaa”。 如果客户端没有收到数据包“aaaa”,服务器应该重新发送数据包。然而,我不知道如何检查它。 这是我的思想打击。 第一例C++ C++;,c++,sockets,client-server,winsock,C++,Sockets,Client Server,Winsock,我想用c/c++中的WinSocket制作一个聊天程序。(我完全是新手。) 第一个问题是关于如何检查客户端是否从服务器接收数据包。 例如,服务器向客户端发送“aaaa”。 如果客户端没有收到数据包“aaaa”,服务器应该重新发送数据包。然而,我不知道如何检查它。 这是我的思想打击。 第一例 服务器--“aaaa”-->客户端。 服务器将检查来自客户端的确认消息的等待时间。 客户端--“我收到了”-->服务器。 服务器不会重新发送数据包 另一种情况。 服务器--“aaaa”-->客户端。 服务器正
服务器--“aaaa”-->客户端。
服务器将检查来自客户端的确认消息的等待时间。
客户端--“我收到了”-->服务器。
服务器不会重新发送数据包
另一种情况。
服务器--“aaaa”-->客户端。
服务器正在等待客户端消息,直到超时
服务器--“aaaa”-->再次访问客户端 但这些可能是不合适的。 看看第二个例子。服务器正在等待来自客户端的消息一段时间。 若超时,服务器将再次重新发送数据包。 在这种情况下,客户端可能会收到两次数据包 第二个问题是如何发送无限大小的数据包。 一本书说,包应该有一个类型,大小和味精。 接下来,我只能发送一定大小的msg。 但我想发送1M字节或更多的消息。(无限制) 怎么做 任何人有任何良好的联系或解释正确的逻辑给我尽可能容易
谢谢。对于第一部分,请查看TCP。 它提供有序和可靠的数据包传输。另外,通过使用UDP自己实现它,您可以在其中进行大量定制。 大体上,它所做的是 服务器: 1.给每个包编号并发送 2.等待特定数据包编号的确认。然后重新传输丢失的数据包 客户: 1.接收数据包并维护缓冲区(滑动窗口) 2.它继续在缓冲区中收集数据包,直到缓冲区溢出或错误的序列数据包到达。一旦发生这种情况,具有正确序列的数据包将被“交付”,最后一个正确数据包的序列号将被发送并确认 第二部分: 我会使用HTTP。 经过一些修改。您应该有一些非常独特的指示器来告诉客户端传输现在已经完成,等等,使用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;
}
等等
如果您可以非常简单&不需要缓冲/重新发送消息到重新连接的客户端,那么就更简单了
您还可以采用“统一消息结构”,将类型和大小(4字节int)作为每条消息或握手的前两个字段。这可能有助于标准化处理这些问题的例程,但会牺牲一些冗余(例如“名称”字段大小).TCP已经处理自动重新发送数据包的问题。除非用户2655083出于某种原因想要使用UDP,或者正在编写另一个协议-gulp。除非您特别想了解低级别TCP/UDP编程的细微差别,否则您可能想查看抽象层,例如或消息传递库,例如或我建议您在线阅读一些教程并查找一些示例源代码。堆栈溢出不是教您如何编写概念的。阅读顶部的帮助部分,了解哪些类型的问题是合适的。谢谢。我明白你的意思。我将搜索并测试它。无论如何,再次谢谢你。