Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;_C++_Sockets_Client Server_Winsock - Fatal编程技术网

C++ C++;

C++ C++;,c++,sockets,client-server,winsock,C++,Sockets,Client Server,Winsock,我想用c/c++中的WinSocket制作一个聊天程序。(我完全是新手。) 第一个问题是关于如何检查客户端是否从服务器接收数据包。 例如,服务器向客户端发送“aaaa”。 如果客户端没有收到数据包“aaaa”,服务器应该重新发送数据包。然而,我不知道如何检查它。 这是我的思想打击。 第一例 服务器--“aaaa”-->客户端。 服务器将检查来自客户端的确认消息的等待时间。 客户端--“我收到了”-->服务器。 服务器不会重新发送数据包 另一种情况。 服务器--“aaaa”-->客户端。 服务器正

我想用c/c++中的WinSocket制作一个聊天程序。(我完全是新手。) 第一个问题是关于如何检查客户端是否从服务器接收数据包。 例如,服务器向客户端发送“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编程的细微差别,否则您可能想查看抽象层,例如或消息传递库,例如或我建议您在线阅读一些教程并查找一些示例源代码。堆栈溢出不是教您如何编写概念的。阅读顶部的帮助部分,了解哪些类型的问题是合适的。谢谢。我明白你的意思。我将搜索并测试它。无论如何,再次谢谢你。