user1156079
user1156079

Reputation: 1

Cannot receive UDP Stream from Port 2368 (Linux) C

I'm currently working with a Laser Sensor that delivers a UDP data stream on Port 2368. I can see the packets with Wireshark.

As I'm not able to post an image, I write what Wireshark shows for a packet:

Source: 192.168.17.141 Destination: 192.168.3.255 Protocol: UDP Source Port: https (443) Destination Port: opentable (2368)

However, I want to read the packets using sockets with following example C program:

int main(int argc, char *argv[])
{
   int sock, n, res;
   unsigned int length = 1206;
   char* buffer = new char[1206];  

   sock= socket(AF_INET, SOCK_DGRAM, 0);
   if (sock < 0) error("socket");

   uint16_t udp_port = 2368;
   sockaddr_in my_addr;                    
   socklen_t len = sizeof(sockaddr_in);
   memset(&my_addr, 0, sizeof(my_addr));   
   my_addr.sin_family = AF_INET;           
   my_addr.sin_port = htons(udp_port);    
   my_addr.sin_addr.s_addr = INADDR_ANY;

   cout << my_addr.sin_family << endl;
   cout << my_addr.sin_port << endl;
   cout << my_addr.sin_addr.s_addr << endl;


   res = bind(sock, (sockaddr *)&my_addr, sizeof(sockaddr_in));
   if (res == -1)
     {
       perror("bind");                 
       return -1;
     }


   while (true)
   {
       n = recvfrom(sock,buffer,1,0,NULL,NULL);
       if (n < 0) error("recvfrom");
   }

   close(sock);
   return 0;
}

The program is successful until it comes to recvfrom(). There the socket waits for packages and does not receive anything. I wrote the same program for Windows with Winsock and it worked perfectly. As I am relatively new to Linux OS I do not know how to fix this problem and would be thankful for advice!

Additional information: I manually assigned following IP and netmask to eth4 (this is the interface where the device is connected):

IP: 192.168.3.5 NM: 255.255.255.0

Upvotes: 0

Views: 2003

Answers (3)

Eugen Rieck
Eugen Rieck

Reputation: 65324

You have

IP: 192.168.3.5 NM: 255.255.255.0

and

Source: 192.168.17.141 Destination: 192.168.3.255

This can't work, if there is no router involved. Try

IP: 192.168.3.5 NM: 255.255.0.0

as an interims measure, but do read up on IP

Edit: Maybe better look into your Laser sensor and set it to 192.168.3.[something free] with Destination directly your 192.168.3.5, and debug the broadcasting later.

Upvotes: 0

TomT the Weatherman
TomT the Weatherman

Reputation: 1306

Set the SO_BROADCAST option, even for receiving. According to the socket(7) manpage:

SO_BROADCAST:
Set or get the broadcast flag. When enabled, datagram sockets receive packets sent to a broadcast address and they are allowed to send packets to a broadcast address. This option has no effect on stream-oriented sockets.

It could also be that your interface config is incorrect. Verify that you have a 192.168.3.xxx/24 address configured for the interface in question.

Upvotes: 1

wildplasser
wildplasser

Reputation: 44250

char buffer[1200+6]; /* no need for dynamic buffers */
...
n = recvfrom(sock, buffer, sizeof buffer, 0, NULL, NULL);

BTW your usage of recvfrom() is equivalent to

n = recv(sock, buffer, sizeof buffer, 0);

, or even:

n = read(sock, buffer, sizeof buffer);

Upvotes: 0

Related Questions