用C++编写服务器程序

Server programming in C++

本文关键字:服务器 程序 C++      更新时间:2023-10-16

我想在c/c++中使用winsocket制作一个聊天程序。(我完全是个新手。)第一个问题是关于如何检查客户端是否从服务器接收到数据包。例如,服务器向客户端发送"aaaa"。如果客户端没有接收到数据包"aaaa",服务器应该重新发送数据包。(我想)。但是,我不知道该怎么查。这是我的思想打击。第一种情况。


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


另一种情况。
服务器---"aaaa"--->客户端。
服务器正在等待客户端消息,直到超时
服务器---"aaaa"--->再次启动客户端。

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

第二个问题是如何发送大小不受限制的数据包。一本书上说,包裹应该有类型、大小和信息。在它之后,我只能发送特定大小的消息。但我想发送1M字节或更多的消息。(无限制)

如何做到这一点?

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

谢谢。

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

TCP已经处理了网络级的数据包,错误检查&重新发送丢失的数据包。它将其作为字节的"流"呈现给应用程序,但不一定保证传递(因为任意一端都可以强制断开连接)。

因此,在应用程序级别,您需要处理Message Receipt&缓冲——重新连接的客户端能够请求以前的消息,而这些消息尚未正确接收。

以下是一些数据结构:

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.
}

您可能还想要一个Connect/Hello握手,或者一个Disconnect/Goodbye握手。

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

等等。

如果你真的很简单&不需要缓冲/重新发送消息到重新连接的客户端,这甚至更简单。

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

对于第一部分,请查看TCP。它提供有序和可靠的数据包传输。此外,通过使用UDP自己实现,您可以在其中进行大量自定义。从广义上讲,它所做的是

服务器:1.对每个数据包进行编号并发送2.等待对特定数据包号码的确认。然后重新传输丢失的数据包。

客户:1.接收数据包并维护缓冲区(滑动窗口)2.它继续收集缓冲区中的数据包,直到缓冲区溢出或到达一个顺序错误的数据包。一旦发生这种情况,具有正确序列的数据包就会被"传递",最后一个正确数据包的序列号会被发送并确认。

第二部分:我会使用HTTP。经过一些修改。就像你应该有一些非常独特的指示器来告诉客户端传输现在已经完成,等等