我最近购买了DragonFire SDK,但我遇到了一些问题。我正在使用NetSend函数将详细信息发送到我的服务器上的PHP脚本,它返回正确的信息,但稍微有点'扭曲'。这是我的PHP脚本:
<?php
$email = isset($_GET['email']) ? $_GET['email'] : "";
$password = isset($_GET['password']) ? $_GET['password'] : "";
if ($email == "tom") {
echo 1;
} else {
echo 0;
}
?>
这就是我正在使用的C ++:
int login_response(int event, char *response, int length) {
printf(response);
return event;
}
回复是:
0ýýýý««««««««
除非我输入'tom'作为电子邮件,否则它是:
1ýýýý««««««««
我不确定为什么要这样做。
答案 0 :(得分:1)
int OnResponse(int event, char *response, int length)
{
int resvalue = response[length];
response[length] = 0;
printf(response);
response[length] = resvalue;
return event;
}
答案 1 :(得分:1)
为了详细说明前面的答案,C和C ++假设字符串以null(\ 0)终止,因此像printf()这样的函数会期望;但是DragonFireSDK的NetSend并不总是使用这个约定,它假设你要查看长度变量中的值。上面的代码只是强制null为printf()的好处。
这可能不是最安全的解决方案。您不知道NetSend发送给回调的内存块是您可以安全写入的内容,即使您在完成后还原原始值,如上所述。如果你必须使用printf(),那么最安全的方法是将字符串复制到其他地方,如局部变量,只有指定的长度。或者,更好的是,如果您不需要去printf(),只需使用数据,但只能读取它。例如,这是一个笨拙但安全的版本:
char *cp;
for (cp = response; cp-response < length; cp++) {
printf("%c",*cp);
}
printf("\n");
然而,这可能是偏执狂。我怀疑这个或任何其他版本的DragonFireSDK可能会使用你无法安全写入的缓冲区。