-3

我有一个字符串说

    char resp_buf[20000];

    sprintf(resp_buf,"HTTP/1.0 404 File not Found.\r\nContent-Type: text/html\r\\
n\r\n<html><body><h2>Error 404: The file your have requested does not exist.</h2\
></body></html>");

因此,在此之后,当我稍后调用发送时-->

send(fd,resp_buf,strlen(a),0);

数据确实被发送,但服务器崩溃并给出分段错误。

我怎样才能找到它的字节大小,以便我可以在 send() 中使用它进行套接字编程。我收到一大堆分割错误。我已经尝试过 strlen(a) 和 sizeof(a),但两者都给出了

分段错误(核心转储)

4

3 回答 3

0
int sprintf(char * restrict str, const char * restrict format, ...);

返回作为返回值打印的字节数,您可能想尝试使用它。

或者总是有

size_t strlen(const char *s);
于 2013-09-13T12:40:50.117 回答
0

您正在尝试在堆栈上分配 20000 个字节。首先,这可能是坠机的原因。您甚至不应该尝试这样做,而且我不会告诉您分配缓冲区的更好方法,因为整个方法是错误的,所以我只是帮助您获得错误的想法来一瘸一拐地工作。

@mbratch 关于 sizeof() 是完全错误的。您无法知道结果字符串总是先验的 sizeof(resp_buf) 字节长,实际上,您发布的代码使字符串远不及那么长。所以这会写一些数据和很多垃圾,这很可能不是你想要的。

当这个错误 HTML 被修改时(稍后,也许是为了响应市场营销的请求)会发生什么?您是否打算在每次他们改变对副本的想法时重新编译您的程序?这不是我对乐趣的看法。请谷歌“开放编码”又名“硬编码”和“反模式”。

当第一个 arg 不是完全受您控制的格式字符串时,您不应该使用 printf 系列函数,否则您将面临格式字符串漏洞的风险。谷歌也是如此。饼干喜欢你这样的人。在您的情况下,它是一个常量字符串,而不是格式字符串。

您可能想要更像使用 fdopen 将 fd 转换为 FILE *,然后使用 fputs,数据来自文件。但更有可能你真的想使用 PHP 或 CMS 或其他东西。

我认为你应该认真问问自己,为什么你要尝试用很少的 C 知识来编写世界上最糟糕的 Web 服务器。Apache 非常擅长向 Web 提供文件。

您没有告诉我们您想要达到的目标,从而阻止我们帮助您避免这种情况。

如果可以的话,我会比现在更多地否决这个问题。

于 2013-09-13T13:25:00.690 回答
0

您可以尝试使用 valgrind。它可以帮助您找到内存泄漏和相关行为。

http://valgrind.org/

于 2013-09-13T15:53:03.707 回答