gpt4 book ai didi

C - 未收到 SIGALRM

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:27 27 4
gpt4 key购买 nike

我是信号的新手,我正在尝试在 UDP 回显服务上设置 SIGALRM,作为套接字编程实践。
所以这里我有一个 UDP 套接字,客户端向服务器发送一个字符串并等待响应(任何响应,这里的字符串由服务器回显)。
目标是设置 SIGALRM 并让客户端在服务器没有响应或 UDP 数据包丢失的情况下重新发送字符串几次。

在这里,我使用了一个小样本并使用...简化了长行,您可以在我的github repo 上获得更多详细信息。 (第 51 行)

sigALRM-Client.c

unsigned int tries = 0;

void CatchAlarm()
{
tries += 1;
}

int main(int argc, char **argv)
{
// SKIPPED
// ...
struct sigaction handler;
handler.sa_handler = CatchAlarm;
handler.sa_flags = 0;
if(sigfillset(&handler.sa_mask) < 0)
return 1;

if(sigaction(SIGALRM, &handler, 0) < 0)
return 2;

ssize_t bytes;

bytes = sendto(servSock,...);

while((bytes = recvfrom(servSock,...)) < 0) {
// alarm went off
if(errno == EINTR) {
// try 5 times
if(tries < 5) {
bytes = sendto(servSock,...);
} else {
fprintf(stdout, "no response, waiting...\n");
}
} else {
fprintf(stdout, "failed to get data\n");
return 3;
}
}
// recvfrom() got something, cancel timeout
alarm(0);
fprintf(stdout, "received %d bytes of data\n", bytes);
close(servSock);
}

当我运行客户端时,它不会收到 SIGALRM 信号并且 UDP 数据包会在第一次尝试时丢失?!
客户端不会重试发送字符串并在尝试 5 次后退出,而是永远等待服务器响应!
是什么阻止了客户端获得 SIGALRM?
我在这里错过了什么吗?

最佳答案

您在 GitHub 存储库中的代码永远不会使用非零数字调用 alarm()。除非您实际请求,否则您永远不会收到自动发送的警报信号。依靠其他一些进程向您的进程发送警报信号是不灵活的。

关于C - 未收到 SIGALRM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45316686/

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