Question

I've been reading through "The Linux Programming Interface" to try and learn about sockets, in particular unix domain sockets. I've read through Chapter 56 which explains some general concepts, and I'm trying to implement a client-server example from Chapter 57.

The server code seems to be working fine, however when I try to connect the client, the call to connect() fails.

Here is the server code:

#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); 
 }

}

And the client code is here:

#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");
  }
}  

When I run the server I see:

$ ./server 
socket success
socket declared
bind successful
listen succeeded

When I run the client I see:

$ ./client 
socket successful
connection unsuccessfully
hello   # <-- I type this
read successful
hello
hwrite successful

If anyone could help me out with this I would be very grateful.

Was it helpful?

Solution

You are missing a parenthesis around this code in your client

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

change it to

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

I also changed the server code to read as follows:

.
.
.

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);
    }

    .
    .
    .

And now it should work :)

Always be mindful of precedence of operators!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top