Я читал «Интерфейс программирования Linux», чтобы попытаться узнать о сокетах, в частности о сокетах домена 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
Если бы кто-нибудь мог помочь мне с этим, я был бы очень благодарен.
errno
в звонкеconnect
? - person Nemo   schedule 27.03.2013Socket operation on non-socket
, однако я этого не понимаю, поскольку вызовsocket()
кажется успешным. - person James   schedule 27.03.2013