- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一些套接字编程,但遇到了一些小问题。
作为扑克游戏的一部分,我已经为服务器和客户端之间的通信定义了一个协议(protocol),所以当任何一方想要在远端触发某个 Action 时,它会创建一个整数数组(简单编码),其中非常第一个 int 是“操作码”,一个简单的代码,详细说明了数据的使用方式以及传输的大小。任何后续的整数都可以被视为该操作的参数(如果适用),模拟函数调用。
每当客户端连接时,服务器需要做的一件事是通知其他客户端有新玩家加入游戏,因此它会向所有其他客户端发送“新玩家已连接”消息,其中包括该新玩家的 table 号。
当服务尝试快速连续地通知客户端时,就会出现问题,正如我的伪代码将演示的那样。发生的情况是服务器发送两个 8 字节的传输,这些传输在远端作为单个 16 字节(4 个整数)接收。结果是客户端仅传递并使用前 8 个字节,忽略其余字节,导致稍后出现困惑(打印出大量垃圾列表),例如,未列出的玩家在聊天中说了些什么。
由于我无法显示我的实际代码,请考虑服务器端相关部分的以下伪代码:
enum PROTOCOLENUMS
{
NOTIFYPROTOCOL = //some number
}
//Reps is simple vector containing custom objects of type playerRepresentation.
for(auto player : Reps)
{
if (player.getSocketNr() != newfiledescriptor)
{
int oldguyInfo[2] =
{NOTIFYPROTOCOL,player.getSocketNr() };
send(newfd,oldguyInfo,sizeof(oldguyInfo),0);
//the old players are simultaniously notified of the new player here.
}
}
在客户端,负责接收传输并传递它的代码看起来像这样(省略了错误检查):
short bytecount
while (true)
{
bytecount = recv(serverSocketDescriptor,buffer,sizeof(buffer),0);
cout<<bytecount<<endl; //Bytecount should ready 8 every time, instead it will accumulate if recv doesn't get called between sends.
InterfacePtr->processTransmission(buffer);
}
就像我说的,当接收端的缓冲区将两个(或更多)发送到内部缓存时,问题就出现了,即传输发生得如此之快以至于 recv() 没有及时解锁以刷新第一个在第二个消息到达之前从缓冲区中取出消息。因此只有第一个传输实际上被后续处理函数(即 processTransmission() )使用。
我猜也有可能是服务端出了问题,也就是说底层API认为可以通过将两个小传输打包成一个来节省一些带宽,而不是直接发送。不过这似乎不太可能。
现在,我真正想问的是:我真的必须在每次接收后解析缓冲区以确定是否有不止一组可用的传输吗?
最佳答案
这种事情的正常方法是定义一个协议(protocol)。协议(protocol)是将每条消息作为逻辑单元引入的形式化方式。
某些协议(protocol)(例如 HTTP)使用定界符(例如换行符)来分隔消息的各个部分(以及消息本身)。
在游戏中,使用二进制协议(protocol)更为正常,其中每条消息都以其长度开头。
例如,您可以采用的一种协议(protocol)是每条消息前面都有 4 个字节,对消息长度进行编码。
然后你的读者端看起来像这样:
while(running)
{
int32_t wire_length = 0;
recv(fd, &length, sizeof(length), 0);
auto length = ntohl(wire_length);
std::vector<uint8_t> buffer(length);
recv(fd, &buffer[0], length, 0);
// buffer now contains exactly one message
// decode and dispatch here
}
关于c++ - 微小的传输最终交织在一起,我真的需要解析缓冲区吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33419287/
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: Why can't Python handle true/false values as I expect?
我是不是遗漏了什么或者这是 ruby 中的错误? a = %w(foo bar baz) a.include? "foo" # => true a.size == 3
从 Modelica 文档来看,注释 Evaluate 似乎只对参数有影响: https://build.openmodelica.org/Documentation/ModelicaReferenc
为了避免嵌套的 if 语句并提高可读性,我想创建一个switch(true){ ... } Coldfusion 中的声明。我在 php 中经常使用这个,但是当我在 Coldfusion 中尝试这个时
嗨,我正在尝试处理 ajax json 响应 这是我的代码 success: function (j) { switch(true) { case (j.cho
我之前在我的 TF 代码中使用过这个: count = "${var.whatever == "true" ? 1 : 0}" 这非常适合我想要使用的东西。但是,我正在考虑如何最好地使用类似于说的
我之前在我的 TF 代码中使用过这个: count = "${var.whatever == "true" ? 1 : 0}" 这非常适合我想要使用的东西。但是,我正在考虑如何最好地使用类似于说的
这个问题在这里已经有了答案: How can I return pivot table output in MySQL? (10 个答案) 关闭 5 年前。 我正在尝试构建一个以唯一列值作为列名的表
我制作了一个简单的 JDialog,其中包含一个标签和一个按钮,它基本上相当于信息对话框。所以在对话框中,有一个方法 display() 我在其中调用了 setVisible(true) 五次。 据我
在 bash 4.2.8(1)-release (x86_64-pc-linux-gnu) 在 Ubuntu 11.04 上这个命令 [ $(wc -l /var/www/some.log|cut -
我正在使用 c 语言进行并发处理,我有一个进程池。为此,我让每个 child 都在一个 While (True) 循环中。为了杀死 child ,我正在使用一个全局变量和一个信号处理程序来修改它来打破
我正在尝试选择填写了字段的数据库条目。数据库有两种插入数据的方式,一种输入评论,一种不输入,我希望只选择填写了评论的行。 $requete = "SELECT * FROM daysoff WHER
如何在 JavaMail session 中setDebug(true) 捕获流并在我的日志记录框架中使用它? (缺少下载源代码,更改接受流作为参数的方法,重新编译它,...) 更一般地说,Java
我是 JavaScript 的新手,我刚刚发现了我无法理解的奇怪行为: var magicVar = Math.sin; magicVar == true; // it returns false m
对此感到困惑。 在两台服务器上运行相同版本的 MySQL。 (从完全相同的 rpm 构建)- 沿线的某个地方,一些开发人员改变了一些东西...... 服务器 1: mysql> select ( no
我在查看 OpenSSL 中使用的一些预处理器宏时,从 crypto/stack/safestack.h 中发现了以下内容: #define CHECKED_STACK_OF(type, p) \
所以我遇到了一个问题,我的正则表达式看起来像这样:/true|false/。 当我检查单词 falsee 时,我从这个正则表达式中得到一个 true,有没有办法将它限制为确切的 true 或 fals
我正在对这个恶意 JavaScript 行进行一些试验:var undefined = true; JavaScript 中每个未初始化的变量都有 undefined 的值,这只是一个保存特殊值 'u
我想将 PHP 的微时间存储为我在 MySQL 中的时间戳。 我去过told最好用 DECIMAL 存储它,但我找不到理想的大小。 有谁知道 microtime(true) 返回的最大大小是多少,所以
在 PHP 中,当您在 URL 中包含诸如“var=true”之类的内容时,URL 中的“true”和“false”是否被转换为 boolean 变量,或者它们是否等于文本“true”还是“假”?例如
我是一名优秀的程序员,十分优秀!