我有一个字符串说
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),但是两者都给了
分段错误(核心转储)
答案 0 :(得分:0)
int sprintf(char * restrict str, const char * restrict format, ...);
返回打印为返回值的字节数,您可能想尝试使用它。
或者总是
size_t strlen(const char *s);
答案 1 :(得分:0)
您正在尝试在堆栈上分配20000个字节。首先,这可能是导致崩溃的原因。您甚至不应该尝试这样做,而且我不会告诉您更好的方法来分配缓冲区,因为整个方法都是错误的,所以我只是帮助您错误地理解工作。< / p>
@mbratch对sizeof()完全错误。你无法知道结果字符串总是与事先确定的sizeof(resp_buf)字节完全相同,事实上,你发布的代码会产生一个远不及那么久的字符串。所以这会写出一些数据和大量垃圾,这很可能不是你想要的。
当(稍后,可能是为了响应来自Marketing的请求)这个错误HTML被修改时会发生什么?你是否打算每次改变他们对副本的想法时重新编译你的程序?这不是我的乐趣。请谷歌“开放编码”,即“硬编码”和“反模式”。
当第一个arg不是完全由您控制的格式字符串时,您不应该使用printf系列函数,否则您会冒格式字符串漏洞的风险。谷歌也是如此。饼干喜欢像你这样的人。在你的情况下,它是一个常量字符串,而不是格式字符串。
你可能想要更像是使用fdopen将fd转换为FILE *,然后使用fputs,数据来自文件。但更有可能你真的想要使用PHP或CMS等。
我认为你应该认真地问自己为什么要用极少量的C知识来编写世界上最疯狂的网络服务器。 Apache非常擅长向Web提供文件。
您未能告诉我们您要实现的目标,从而阻止我们帮助您避免这种情况。
如果可以的话,我会把这个问题投下来甚至更多。
答案 2 :(得分:0)
您可以尝试使用valgrind。它可以帮助您找到内存泄漏和相关行为。