gpt4 book ai didi

c - 为什么这个自定义网络服务会崩溃(用 C 语言编写)?

转载 作者:太空宇宙 更新时间:2023-11-04 07:31:58 24 4
gpt4 key购买 nike

我编写了这个程序,它监听给定的端口,然后,一旦收到连接,输出一行文本并断开连接。它运行了几天,处理了数千个查询,但随后(不可避免地)崩溃了,我不得不重新启动它。想知道是否有人发现它有任何问题,或者(或者)是否有人可以提出一种使其更健壮的方法。

int main(int argc, char *argv[])
{
srand(time(0));

int sockfd, newsockfd, portno;
socklen_t clilen;
struct sockaddr_in serv_addr, cli_addr;
int n;
if (argc < 2) {
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);

while (1)
{
unsigned char write_val;
unsigned char y[BYTES];
int i, j;

newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR on accept");

fill_buffer(y); // fills buffer y with a 128-bit string; not included here
for (i=BYTES-1; i >= 0; i--)
{
const void* ZERO = (void *)"0";
const void* ONE = (void *)"1";

for (j=7; j >= 0; j--)
write(newsockfd, (y[i] >> j) & 1 ? ONE : ZERO, 1);
}

write(newsockfd, "\n", 1);
close(newsockfd);
}

close(sockfd);
return 0;
}

最佳答案

anyone sees anything wrong with it

虽然这段代码可以变得更高效(例如,通过一次写入所有字节),但那里没有明显的缺陷。

这使得您的代码中未发布的部分成为该问题的合适候选者:

fill_buffer(y);  // fills buffer y with a 128-bit string; not included here

如果您读取的字节数超过 y[] 的大小,那么您将会崩溃。

or (alternatively) if anyone can suggest a way to make it more robust

尝试扩大此 y[] 缓冲区的大小(加倍不会有什么坏处)。

并确保 fill_buffer() 不能读取超过 BYTES 个字符。

如有疑问,请发布此缺失代码。

您还可以使用调试符号编译您的代码,并从您的信号处理程序中将回溯(带有符号)转储到一个文件中。这样,如果您的程序崩溃了,您就会知道哪里为什么

关于c - 为什么这个自定义网络服务会崩溃(用 C 语言编写)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12989156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com