commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r4284 - gnuradio/branches/developers/trondeau/ethernet


From: trondeau
Subject: [Commit-gnuradio] r4284 - gnuradio/branches/developers/trondeau/ethernet/gnuradio-core/src/lib/io
Date: Wed, 17 Jan 2007 14:42:28 -0700 (MST)

Author: trondeau
Date: 2007-01-17 14:42:28 -0700 (Wed, 17 Jan 2007)
New Revision: 4284

Modified:
   
gnuradio/branches/developers/trondeau/ethernet/gnuradio-core/src/lib/io/gr_ethernet_sink.cc
   
gnuradio/branches/developers/trondeau/ethernet/gnuradio-core/src/lib/io/gr_ethernet_source.cc
Log:
added error handling

Modified: 
gnuradio/branches/developers/trondeau/ethernet/gnuradio-core/src/lib/io/gr_ethernet_sink.cc
===================================================================
--- 
gnuradio/branches/developers/trondeau/ethernet/gnuradio-core/src/lib/io/gr_ethernet_sink.cc
 2007-01-16 22:56:03 UTC (rev 4283)
+++ 
gnuradio/branches/developers/trondeau/ethernet/gnuradio-core/src/lib/io/gr_ethernet_sink.cc
 2007-01-17 21:42:28 UTC (rev 4284)
@@ -84,43 +84,39 @@
 {
   omni_mutex_lock l(d_mutex);  // hold mutex for duration of this function
 
-  int ret = 0;
-  bool OptVal = true;
-  int OptLen = sizeof(bool);
-  int LngrLen = sizeof(linger);
+  // create socket
+  if(d_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) == NULL) {
+    perror("socket open");
+    throw std::runtime_error("can't open socket");
+  }
+
+  // Turn on reuse address
+  bool opt_val = true;
+  if(setsockopt(d_socket, SOL_SOCKET, SO_REUSEADDR, (void*)&opt_val, 
sizeof(int))) {
+    perror("SO_REUSEADDR");
+    throw std::runtime_error("can't set socket option SO_REUSEADDR");
+  }
+
+  // Don't wait when shutting down
   linger lngr;
   lngr.l_onoff  = 1;
   lngr.l_linger = 0;
+  if(setsockopt(d_socket, SOL_SOCKET, SO_LINGER, (void*)&lngr, 
sizeof(linger))) {
+    perror("SO_LINGER");
+    throw std::runtime_error("can't set socket option SO_LINGER");
+  }
 
-  // create socket
-  d_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-  ret = setsockopt(d_socket, SOL_SOCKET, SO_REUSEADDR, (char*)&OptVal, OptLen);
-  ret = setsockopt(d_socket, SO_LINGER, SO_REUSEADDR, (char*)&lngr, LngrLen);
-
   // bind socket to an address and port number to listen on
-  ret = bind(d_socket, (sockaddr*)&d_sockaddr_local, sizeof(struct sockaddr));
-
-  #if SNK_VERBOSE
-  if(!ret) {
-    fprintf(stderr, "Source: bind address succeeded.\n");
+  if(bind (d_socket, (sockaddr*)&d_sockaddr_local, sizeof(struct sockaddr))) {
+    perror("socket bind");
+    throw std::runtime_error("can't bind socket");
   }
-  else {
-    fprintf(stderr, "Source: bind address failed.\n");
-    exit(ret);
-  }
-  #endif
 
-  ret = connect(d_socket, (sockaddr*)&d_sockaddr_remote, sizeof(struct 
sockaddr));
-
-  #if SNK_VERBOSE
-  if(!ret) {
-    fprintf(stderr, "Source: connection succeeded.\n");
+  // Not sure if we should throw here or allow retries
+  if(connect(d_socket, (sockaddr*)&d_sockaddr_remote, sizeof(struct 
sockaddr))) {
+    perror("socket connect");
+    throw std::runtime_error("can't connect to socket");
   }
-  else {
-    fprintf(stderr, "Source: connection failed.\n");
-    exit(ret);
-  }
-  #endif
 
   d_updated = true;
   return d_socket != 0;
@@ -149,7 +145,7 @@
 
   while(bytes_sent < total_size) {
     bytes_to_send = (bytes_sent+d_mtu < total_size ? d_mtu : 
total_size-bytes_sent);
-    bytes =send(d_socket, (in+bytes_sent), bytes_to_send, 0);
+    bytes =send(d_socket, (in+bytes_sent), bytes_to_send, MSG_DONTWAIT);
     bytes_sent += bytes;
   }
 

Modified: 
gnuradio/branches/developers/trondeau/ethernet/gnuradio-core/src/lib/io/gr_ethernet_source.cc
===================================================================
--- 
gnuradio/branches/developers/trondeau/ethernet/gnuradio-core/src/lib/io/gr_ethernet_source.cc
       2007-01-16 22:56:03 UTC (rev 4283)
+++ 
gnuradio/branches/developers/trondeau/ethernet/gnuradio-core/src/lib/io/gr_ethernet_source.cc
       2007-01-17 21:42:28 UTC (rev 4284)
@@ -70,38 +70,44 @@
 {
   omni_mutex_lock l(d_mutex);  // hold mutex for duration of this function
    
-  int ret = 0;
-
   // create socket
   d_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+  if(d_socket == 0) {
+    perror("socket open");
+    throw std::runtime_error("can't open socket");
+  }
 
   // Turn on reuse address
   bool opt_val = true;
-  ret = setsockopt(d_socket, SOL_SOCKET, SO_REUSEADDR, (void*)&opt_val, 
sizeof(bool));
+  if(setsockopt(d_socket, SOL_SOCKET, SO_REUSEADDR, (void*)&opt_val, 
sizeof(int))) {
+    perror("SO_REUSEADDR");
+    throw std::runtime_error("can't set socket option SO_REUSEADDR");
+  }
 
   // Don't wait when shutting down
   linger lngr;
   lngr.l_onoff  = 1;
   lngr.l_linger = 0;
-  ret = setsockopt(d_socket, SOL_SOCKET, SO_LINGER, (void*)&lngr, 
sizeof(linger));
+  if(setsockopt(d_socket, SOL_SOCKET, SO_LINGER, (void*)&lngr, 
sizeof(linger))) {
+    perror("SO_LINGER");
+    throw std::runtime_error("can't set socket option SO_LINGER");
+  }
 
   // Set a timeout on the receive function to not block indefinitely
+  // This value can (and probably should) be changed
   timeval timeout;
   timeout.tv_sec = 1;
   timeout.tv_usec = 0;
-  ret = setsockopt(d_socket, SOL_SOCKET, SO_RCVTIMEO, (void*)&timeout, 
sizeof(timeout));
+  if(setsockopt(d_socket, SOL_SOCKET, SO_RCVTIMEO, (void*)&timeout, 
sizeof(timeout))) {
+    perror("SO_RCVTIMEO");
+    throw std::runtime_error("can't set socket option SO_RCVTIMEO");
+  }
 
   // bind socket to an address and port number to listen on
-  ret = bind (d_socket, (sockaddr*)&d_sockaddr_local, sizeof(struct sockaddr));
-  #if SRC_VERBOSE
-  if(!ret) {
-    fprintf(stderr, "Sink: bind address succeeded\n");
+  if(bind (d_socket, (sockaddr*)&d_sockaddr_local, sizeof(struct sockaddr))) {
+    perror("socket bind");
+    throw std::runtime_error("can't bind socket");
   }
-  else {
-    fprintf(stderr, "Sink: bind failed (%d).\n", ret);
-    exit(ret);
-  }
-  #endif 
   
   d_updated = true;
   return d_socket != 0;





reply via email to

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