DragonFire SDK NetSend响应

时间:2011-11-21 16:33:05

标签: c++

我最近购买了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ýýýý««««««««

我不确定为什么要这样做。

2 个答案:

答案 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可能会使用你无法安全写入的缓冲区。