【发布时间】:2013-06-24 08:01:42
【问题描述】:
我不明白为什么这个应用程序在send 上死掉了。这是服务器的代码:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <stdlib.h>
#include <errno.h>
#define UNIX_PATH_MAX 108
#define SPATH "./sock"
int main() {
int sfd, rv = 100, newfd;
char b[100];
char ok[3] = "ok\0";
struct sockaddr_un sa;
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
strncpy(sa.sun_path, SPATH, UNIX_PATH_MAX);
sa.sun_family = AF_UNIX;
if (bind(sfd, (struct sockaddr*)&sa, sizeof(sa)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
if (listen(sfd, SOMAXCONN) == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
if ((newfd = accept(sfd, NULL, NULL)) == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
while (rv != -1 && rv != 0) {
rv = recv(newfd, b, 100, 0);
printf("%s\n", b);
sleep(3);
printf("Send reply\n");
send(newfd, ok, 3, 0);
printf("Sent reply\n");
}
printf("END\n");
}
不幸的是,如果客户端在发送消息后立即使用Ctrl+C 强制关闭,服务器将打印(如最后一行):
before send
然后它什么也没做就死了。我试图检查 errno 或其他任何内容(包括在 if 语句中对 send 的调用),但似乎是 send 本身导致服务器死机。我试过write,但它是一样的。
我用 bash 检查了它的返回码,它以返回码 141 退出,我无法理解它的含义。
如果你想试试,这里是客户端代码:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#define UNIX_PATH_MAX 108
#define SPATH "./sock"
int main() {
int sfd, rv;
char b[100];
char ok[3];
struct sockaddr_un sa;
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
strncpy(sa.sun_path, SPATH, UNIX_PATH_MAX);
sa.sun_family = AF_UNIX;
connect(sfd, (struct sockaddr*)&sa, sizeof(sa));
while (scanf("%s", b)) {
send(sfd, b, 100, 0);
recv(sfd, ok, 3, 0);
printf("%s\n", ok);
}
printf("END\n");
}
只需编译两者,运行两者,然后在消息发送后使用 Ctrl+C 终止客户端。
【问题讨论】:
-
但这不是预期的吗?毕竟,服务器写入数据的客户端不再可用。
-
在服务器中,刚才,为什么你没有检查recv()的返回值??,在使用printf之前,你必须nul终止你新接收的字符串,例如, b[rev] = 0
-
没有人会“只编译两个,运行两个,然后杀死客户端”。您应该在此处发布错误消息、堆栈跟踪等。这不是免费的二级帮助台,您也没有报告某些供应商代码中的软件错误。 -1
-
当程序的退出状态> 128时,表示它被
status-128信号杀死。如果你查看 Unix 信号列表,你会看到 13 是SIGPIPE。 -
@EJP,可能没有人编译它,但有些人已经阅读了整个问题,而不仅仅是最后一行。我已经发布了我得到的错误代码,他们甚至没有尝试运行代码就找到了解决方案。感谢您关于如何在 Stackoverflow 上提问的课程,但不幸的是,这不是我的疑问。干杯。