bug-hurd
[Top][All Lists]
Advanced

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

Strange select behavior


From: Giuseppe Scrivano
Subject: Strange select behavior
Date: Sat, 30 Oct 2004 20:03:51 +0200 (CEST)

Hi,
This simple C program seems to work differently on
hurd and on linux. While under linux the dataToRead
function returns 1 when a connection is up, under hurd
this function always returns 0.

Regards,
Giuseppe Scrivano




                
___________________________________ 
Nuovo Yahoo! Messenger: E' molto più divertente: Audibles, Avatar, Webcam, 
Giochi, Rubrica… Scaricalo ora! 
http://it.messenger.yahoo.it
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>

int dataToRead(int);

int
main (void)
{

  int server_socket, asock;
  struct  sockaddr_in  sock_in, asock_in;
  int err, backlog = 1, addrlen;
  char send_buff[] = "HELLO WORLD!!!\n";
  char recv_buff = ' ';
  server_socket = socket (PF_INET, SOCK_STREAM, 0);
  
  /* address family.  */
  sock_in.sin_family = PF_INET;
  
  /* port used.  */
  sock_in.sin_port = htons (8080);
  sock_in.sin_addr.s_addr = INADDR_ANY;
  err = bind (server_socket, (struct sockaddr *) &sock_in, sizeof (struct 
sockaddr_in));

  for(;;)
  {
    err = listen (server_socket, backlog);
    addrlen = sizeof (struct sockaddr);
    socklen_t ddrlen=0;
    int datatoread;
    do
    {
      datatoread = dataToRead(server_socket);
      sleep(1);
      printf("datatoread: %i\n",datatoread);
    }
    while(!datatoread);
    
    asock = accept (server_socket, (struct sockaddr *) &asock_in, &ddrlen);

    err = send (asock, &send_buff[0], strlen (send_buff), 0);
    if(err != strlen (send_buff))
      printf("Error sending to socket\n");
    shutdown (asock, 2);
    err = close(asock);
  }
  shutdown (server_socket, 2);
  err = close (server_socket);

}


int dataToRead(int server_socket)
{
  struct timeval tv;
  fd_set readfds;

  tv.tv_sec = 0;
  tv.tv_usec = 500;

  FD_ZERO(&readfds);
  FD_SET(server_socket, &readfds);
  select(server_socket+1, &readfds, NULL, NULL, &tv);

  if (FD_ISSET(server_socket, &readfds))
   return 1;
  else
  return 0;
}


reply via email to

[Prev in Thread] Current Thread [Next in Thread]