2010-04-28 4 views
2

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

Когда я пытаюсь передать с 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

Пожалуйста, убедитесь, что ваш код вставлен правильно в сообщение (используя специальную кнопку кода, которую вы можете выбрать при создании сообщения), теперь никто не может ее прочитать ^^ " – Bas

+0

При попытке превратить это в колодец -форматированной SO-разметки, я заметил, что последний оператор if («if (setsockopt (...») не является корректным. У него отсутствует хотя бы один »)». –

+0

Сколько байтов вы пытаетесь отправить? Также вы пытаетесь отправить строку ASCII или файл? –

ответ

1

Было бы неплохо получить дополнительную информацию о длине отправляемых данных. Предполагаю, что вы пытаетесь отправить 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); 
    } 
+0

Благодарим за отзыв. Петли предназначены только для демонстрации команды отправки в фактическом коде. Я использую таймер, отправляющий/получающий пакет каждые 0,1 секунды. Что касается данных, которые я пытаюсь отправить, прямо сейчас это строка ASCII, но в конечном итоге это будут пакеты RTP. – Eli

+0

Вы запрашиваете помощь по определенному коду, но затем показываете на его месте код псевдокода? Бессмысленные! –

Смежные вопросы