このアプリケーションが で終了する理由がわかりません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
そして、何もせずに死んでいきます。send
errno など ( 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 でクライアントを強制終了します。