Клиент сокета домена Unix не будет подключаться

Я читал «Интерфейс программирования 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

Если бы кто-нибудь мог помочь мне с этим, я был бы очень благодарен.


person James    schedule 27.03.2013    source источник
comment
Что за errno в звонке connect?   -  person Nemo    schedule 27.03.2013
comment
Он говорит Socket operation on non-socket, однако я этого не понимаю, поскольку вызов socket() кажется успешным.   -  person James    schedule 27.03.2013


Ответы (1)


Вам не хватает круглых скобок вокруг этого кода в вашем клиенте

if(sfd = socket(AF_UNIX, SOCK_STREAM, 0) > 0){

изменить его на

if((sfd = socket(AF_UNIX, SOCK_STREAM, 0)) > 0){

Я также изменил код сервера, чтобы он читался следующим образом:

.
.
.

socklen_t csize; 

while(1){

    cfd = accept(sfd, (struct sockaddr *)&addr,&csize);

    if (cfd < 0) {
      printf("accept failed: %s\n", strerror(errno));
    }
    else{
      printf("accept succeeded: %d\n", cfd);
    }

    .
    .
    .

А теперь должно работать :)

Всегда помните о приоритете операторов!

person Forhad Ahmed    schedule 27.03.2013
comment
Спасибо, вроде разобрался! Я получаю кучу мусора, напечатанного сервером, когда он получает сообщение, но я думаю, что мне просто нужно посмотреть на мою обработку строк, не слишком знакомую с C. - person James; 27.03.2013