Re: Problem with socketpair , AF_UNIX and select call - can anybody through any light on this!

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Stephen Croll wrote:
Howard Wilkinson wrote:
Can you suggest such a list - I can only find lists for POSIX threads!
comp.unix.programmer
Thanks for that!
Code goes as follows

I haven't really looked at the code, except for making mods to get it to compile, but it works for me:

pika.localdomain:~/tmp 0:12> uname -a
Linux pika.localdomain 2.6.22.9-91.fc7 #1 SMP Thu Sep 27 20:47:39 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux

.....
--
Steve Croll

I obviously oversimplified the code - attached is my real test case .....

server - Socket is ready to write
server - Socket is not ready to read
master - Socket is ready to write
master - Socket is ready to read
master - recv - Resource temporarily unavailable(11)

Hmmm!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

int socktest(int fd, char *prefix) {
  fd_set 		rfd, wfd, efd;
  int 			rv;
  char 			buf[1024];
  struct timeval	timeout = { 10, 0 };

  FD_ZERO(&rfd);
  FD_ZERO(&wfd);
  FD_ZERO(&efd);
  FD_SET(fd, &rfd);
  FD_SET(fd, &wfd);
  FD_SET(fd, &efd);

  rv = select(fd+1, &rfd, &wfd, &efd, &timeout);
  if (rv < 0) {
    printf("%s - socketpair %s", prefix, strerror(errno));
    exit(1);
  }

  if (FD_ISSET(fd, &wfd)) printf("%s - Socket is ready to write\n", prefix);
  if (FD_ISSET(fd, &efd)) printf("%s - Socket is in except\n", prefix);

  if (FD_ISSET(fd, &rfd)) {
    printf("%s - Socket is ready to read\n", prefix);
    rv = recv(fd, buf, sizeof(buf), MSG_DONTWAIT);
    if (rv < 0) {
      printf("%s - recv - %s(%d)\n", prefix, strerror(errno), errno);
      exit (1);
    }

    printf("%s - Socket returned %d bytes\n", prefix, rv);
  } else {
    printf("%s - Socket is not ready to read\n", prefix);
  }

  exit (0);
}

int main() {
  int 			fd[2] = { -1, -1 };
  int			rv;
  pid_t			pid;

  rv = socketpair(PF_UNIX, SOCK_DGRAM, 0, fd);
  if (rv < 0) printf("socketpair");

  fcntl(fd[0], F_SETFL, fcntl(fd[0], F_GETFL, 0) | O_NONBLOCK);

  if ((pid = fork()) > 0) {
    shutdown(fd[1], 2);
    close(fd[1]);
    socktest(fd[0], "master");
  } else {
    shutdown(fd[0], 2);
    close(fd[0]);
    socktest(fd[1], "server");
  }
}


[Index of Archives]     [Current Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]     [Fedora Docs]

  Powered by Linux