• C

sendto & signals

I'm writing a procedure that creates a UDP socket with a piece of hardware. In my code I basically do this:
     create the socket()
     bind() the socket
     sendto () try to setup comm.
     recvfrom () receive response

but if this hw is not turned on, then my code just waits indefinity for a response.

I'm trying to us the setitimer to time the sendto out, but its not working.  I setup the setitimer and trap the signal but the code never sends a signal.

  signal (SIGALRM, function_call);
  setitimer (ITIMER_REAL, &itv, (struct itimerval *) 0);

I'm missing something, between sendto & setitimer?  Any ideas?
bcarderAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

ufolk123Commented:
Hi bcarder,

Is there any printf in your signal handler code?May be the alarm is expiring very early and resulting to a race condition.
Also,You should use sigaction() instead of signal().
Please Give me more details.


ufolk123
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
bcarderAuthor Commented:
yes I had some printf statements in the sig handler.  That function consist of three printf statements followed by a call to another function to terminate the process.

As far as the race condition, I up the timer time to 10 seconds and it still just waits.

I will check into the sigaction.

What other information would you like?
0
ufolk123Commented:
Could you post me sample of your code ?


Regards,
ufolk123
0
bcarderAuthor Commented:
Here is the code where I'm trying to connect and trapping the signal.  Good Luck!

#include <unistd.h>
int InitAtlasInterface(SERVER_REC *server_info)
{
   extern void Terminate_Control_Spacecraft();

   struct itimerval value, value2;
   struct sockaddr_in maestro_addr;
   ATLAS_INTERFACE msg;
   int portNumber,len;
   static struct hostent *host = NULL;
   size_t atlas_size, msg_size, maestro_size;
   int error;
   char host_name[64];

   /* Setup to send inital message to atlas 360 */
   memset(&msg, 0, sizeof(msg));
   bzero(&msg,sizeof(msg));
   msg.type = WPWR_MESS;
   msg.cmd = ATLAS_BKEN_OPEN;
   bzero(msg.tgtName,sizeof(msg.tgtName));
   msg.data[0]=2;
   msg_size = sizeof(msg);


   /* Retreive info for machine Maestro is run from */
   gethostname (host_name, 64);
   host = gethostbyname (host_name);

   if (!host)
   {
      return FAIL;
   }

   /* Setup to bind the socket */
   memset((char *) &maestro_addr, 0, sizeof(struct sockaddr_in));
   bzero((char *)&maestro_addr,sizeof(maestro_addr));
   maestro_addr.sin_family = AF_INET;
   bcopy ((char *) host->h_addr, (char *) &maestro_addr.sin_addr,
         host->h_length);
   maestro_addr.sin_port = 0;
   maestro_size = sizeof(atlas_addr);
   len = sizeof(struct sockaddr_in);

   /* Retreive info for Atlas interface is run from */
   host = gethostbyname (server_info->machine_name);
   portNumber = Get_Port_By_Service(server_info->server_name);

   if (!host)
   {
      return FAIL;
   }
   else if (portNumber <= 0)
   {
      return FAIL;
   }

   /* Setup to sendto the Atlas */
   memset((char *) &atlas_addr, 0, sizeof(struct sockaddr_in));
   bzero((char *)&atlas_addr,sizeof(atlas_addr));
   atlas_addr.sin_family = AF_INET;
   bcopy ((char *) host->h_addr, (char *) &atlas_addr.sin_addr,
             host->h_length);
   atlas_addr.sin_port = portNumber;
   atlas_size = sizeof(atlas_addr);

   if ((server_info->server_handle  =  socket(AF_INET,SOCK_DGRAM,0) ) < 0)
   {
      fprintf(stderr, "InitAtlasInterface - can not open sock on %s\n",
                                  server_info->machine_name);
      server_info->server_handle = 0;
      server_info->server_instance = 0;
      return FAIL;
   }

   if (bind(server_info->server_handle,(struct sockaddr *)&maestro_addr,
                maestro_size) < 0)
   {
      fprintf(stderr, "InitAtlasInterface - can not bind %s\n",
                        server_info->machine_name);
      server_info->server_handle = 0;
      server_info->server_instance = 0;
      return FAIL;
   }

   Trap_Signals ();

   value.it_interval.tv_sec  = 0;
   value.it_interval.tv_usec = 0;
   value.it_value.tv_usec   = 0;
   value.it_value.tv_sec    = 10;

   error = setitimer (ITIMER_REAL, &value, (struct itimerval *) 0);
 
   if (sendto (server_info->server_handle,(void *)&msg,msg_size,0,
               (struct sockaddr *)&atlas_addr, atlas_size) < 0)
   {
      fprintf(stderr, "InitAtlasInterface - can not send to %s\n",
                        server_info->server_name);
      server_info->server_handle = 0;
      server_info->server_instance = 0;
      return FAIL;
   }
   else
   {
      value.it_interval.tv_sec  = 0;
      value.it_interval.tv_usec = 0;
      value.it_value.tv_sec  = 0;
      value.it_value.tv_usec = 0;

      setitimer (ITIMER_REAL, &value, (struct itimerval *) 0);
   }

   if (recvfrom(server_info->server_handle,(void *)&msg, msg_size,0,
                (struct sockaddr *)&atlas_addr, &len) < 0)
   {
      fprintf(stderr, "InitAtlasInterface - did not receive message from %s\n",
                        server_info->server_name);
      server_info->server_handle = 0;
      server_info->server_instance = 0;
      return FAIL;
   }

   fprintf(stderr, "InitAtlasInterface: port # %d\n", atlas_addr.sin_port);
   fprintf(stderr, "InitAtlasInterface: ACK = %d\n", msg.cmd);
   if (msg.cmd == ATLAS_BKEN_TGTNF)
   {
      fprintf(stderr, "InitAtlasInterface - did not receive CMD ACK from %s\n",
                        server_info->server_name);
      server_info->server_handle = 0;
      server_info->server_instance = 0;
      return FAIL;
   }

   /*server_info->server_instance = ?;*/
   return PASS;
}

static void Trap_Signals ()
{
   extern void Bad_Connect (int);

   signal (SIGALRM, Bad_Connect);
}

void Bad_Connect (int sig_num)
{
   extern void Terminate_Control_Spacecraft();

   fprintf(stderr, "atlas card didn't connect, received interrupt\n");
   fprintf(stderr, "Terminating Commander, must do session init, after\n");
   fprintf(stderr, "Check out atlas card, make sure its POWERED UP!\n");
   Terminate_Control_Spacecraft();
}
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C

From novice to tech pro — start learning today.