我不明白为什么这个应用程序在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 或其他任何内容(包括send
if 语句中的调用),但似乎它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 终止客户端。