Reciving UDP packets on iPhone

Posted by Eli on Stack Overflow See other posts from Stack Overflow or by Eli
Published on 2010-04-28T14:37:51Z Indexed on 2010/04/29 6:07 UTC
Read the original article Hit count: 612

Filed under:
|

I'm trying to establish UDP communication between a MAC OS and an iPod through Wi-Fi, at this point I'm able to send packets from the iPod and I can see those packets have the right MAC and ip addresses (I'm using wireshark to monitor the network) but the MAC receives the packets only when the wireshark is on, otherwise recvfrom() returns -1.

When I try to transmit from MAC to iPhone I have the same result, I can see the packets are sent but the iPhone doesn't seem to get them.

I'm using the next code to send:

 struct addrinfo hints; 
 int rv; 

 memset(&hints, 0, sizeof hints); 
 hints.ai_family = AF_UNSPEC; 
 hints.ai_socktype = SOCK_DGRAM;

 if ((rv = getaddrinfo(IP, SERVERPORT, &hints, &servinfo)) != 0) { 
  fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
  return 1;
 }
 // loop through all the results and make a socket 
 for(p = servinfo; p != NULL; p = p->ai_next) {
  if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { 
   perror("talker: socket"); 
   continue;
  }   
  break;
 }

 if (p == NULL) { 
  fprintf(stderr, "talker: failed to bind socket\n"); 
  return 2;
 }
 while (cond)
  sntBytes += sendto(sockfd, message, strlen(message), 0, p->ai_addr, p->ai_addrlen); 
 return 0;

and this code to receive:

struct addrinfo hints, *p; 
 int rv;

 memset(&hints, 0, sizeof hints); 
 hints.ai_family = AF_UNSPEC; // set 
 hints.ai_socktype = SOCK_DGRAM; 
 hints.ai_flags = AI_PASSIVE; // use to AF_INET to force IPv4 my IP 

 if ((rv = getaddrinfo(NULL, MYPORT, &hints, &servinfo)) != 0) {
  fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
  return 1;
 }
 // loop through all the results and bind to the first we can 
 for(p = servinfo; p != NULL; p = p->ai_next) {
  if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
   perror("listener: socket"); 
   continue;
  }  


  if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { 
   close(sockfd);
   perror("listener: bind"); 
   continue;
  } 

  break;
 }

 if (p == NULL) { 
  fprintf(stderr, "listener: failed to bind socket\n"); 
  return 2;
 } 

 addr_len = sizeof their_addr; 
 fcntl(sockfd, F_SETFL,O_NONBLOCK);

 int rcvbuf_size = 128 * 1024; // That's 128Kb of buffer space.
 setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, 
       &rcvbuf_size, sizeof(rcvbuf_size));

 printf("listener: waiting to recvfrom...\n");

 while (cond)
    rcvBytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0, (struct sockaddr *)&their_addr, &addr_len);

return 0;

What am I missing?

© Stack Overflow or respective owner

Related posts about iphone

Related posts about udp