Получение пакетов UDP на iPhone - PullRequest
2 голосов
/ 28 апреля 2010

Я пытаюсь установить UDP-связь между MAC OS и iPod через Wi-Fi, на данный момент я могу отправлять пакеты с iPod и вижу, что эти пакеты имеют правильные MAC-адреса и IP-адреса ( Я использую Wireshark для мониторинга сети), но MAC получает пакеты только тогда, когда Wireshark включен, в противном случае recvfrom () возвращает -1.

Когда я пытаюсь передать данные с MAC на iPhone, у меня тот же результат, я вижу, что пакеты отправляются, но iPhone, похоже, их не получает.

Я использую следующий код для отправки:

 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;

и этот код для получения:

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;

Чего мне не хватает?

1 Ответ

1 голос
/ 29 апреля 2010

Было бы хорошо получить дополнительную информацию о длине данных, которые вы отправляете. Я предполагаю, что вы пытаетесь отправить ASCII string.

Кроме того, это, кажется, либо никогда не вызывается, либо бесконечный цикл отправки:

while (cond)
  sntBytes += sendto(sockfd, message, strlen(message), 0, p->ai_addr, p->ai_addrlen);

Возможно, вы захотите использовать код, который фактически включает некоторую проверку ошибок:

Отправить строку

int sendResult = send( connectedSocket, stringBuffer, stringLength, 0 );
    if (sendResult == -1)  {
        perror("Error while trying to send string!");
    }
    else {
        NSLog(@"String '%s' sent successfully", stringBuffer );
    }

Строка получения

memset( ReceiveBuffer, '\0', sizeof(ReceiveBuffer) );
    int receiveResult = recv( connectedSocket, ReceiveBuffer, sizeof(ReceiveBuffer), 0);
    if ( receiveResult == -1 ) {
        perror("recv");
    }
    else {
        NSLog(@"String received successfully: '%s'", ReceiveBuffer );
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...