「The Linux Programming Interface」を読んで、ソケット、特に UNIX ドメイン ソケットについて学びました。いくつかの一般的な概念を説明している第 56 章を読み、第 57 章のクライアント/サーバーの例を実装しようとしています。
サーバー コードは正常に動作しているように見えますが、クライアントに接続しようとすると、呼び出しがconnect()
失敗します。
サーバーコードは次のとおりです。
#include<sys/un.h>
#include<sys/socket.h>
#include<stdio.h>
#define SV_SOCK_PATH "/tmp/boom"
#define BUF_SIZE 100
#define BACKLOG 5
int main(int argc, char *argv[]){
struct sockaddr_un addr;
int sfd, cfd;
ssize_t numRead;
char buf[BUF_SIZE];
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if(sfd!=0){
printf("socket success\n");
}
else{
printf("socket unsuccessful\n");
}
printf("socket declared\n");
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SV_SOCK_PATH, sizeof(addr.sun_path)-1);
if (bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un))!=0){
printf("bind unsuccessful\n");
}
else{
printf("bind successful\n");
}
if (listen(sfd, BACKLOG) != 0){
printf("listen failed\n");
}
else{
printf("listen succeeded\n");
}
while(1){
if( cfd = accept(sfd, NULL,NULL) != 0){
printf("accept failed\n");
}
else{
printf("accept succeeded\n");
}
while ((read(cfd, buf, BUF_SIZE)) > 0)
write(1, buf, numRead);
}
}
クライアントコードは次のとおりです。
#include<stdio.h>
#include<sys/un.h>
#include<sys/socket.h>
#define SV_SOCK_PATH "/tmp/boom"
#define BUF_SIZE 100
#define BACKLOG 5
int main(int argc, char *argv[]){
struct sockaddr_un addr;
int sfd, cfd;
ssize_t numRead;
char buf[BUF_SIZE];
if(sfd = socket(AF_UNIX, SOCK_STREAM, 0) > 0){
printf("socket successful\n");
}
else{
printf("socket fucked\n");
}
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SV_SOCK_PATH, sizeof(addr.sun_path)-1);
if(connect(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un)) == -1){
printf("connection unsuccessfully\n");
}
else{
printf("connection successful\n");
}
if(numRead = read(0, buf, BUF_SIZE) > 0){
printf("read successful\n");
printf(buf);
}
else{
printf("read unsuccessful\n");
}
if (write(sfd, buf, numRead) > 0){
printf("write successful\n");
}
else{
printf("write unsuccessful\n");
}
}
サーバーを実行すると、次のように表示されます。
$ ./server
socket success
socket declared
bind successful
listen succeeded
クライアントを実行すると、次のように表示されます。
$ ./client
socket successful
connection unsuccessfully
hello # <-- I type this
read successful
hello
hwrite successful
誰かがこれで私を助けることができれば、私はとても感謝しています.