2011-05-05 6 views
1

UDP를 통해 네트워크로 데이터를 보내려고합니다.iOS UDP 브로드 캐스트와 PHP UDP 브로드 캐스트 비교

18 : 53 : 24.504447 IP 10.0.1.2.52919> 225.0.0.0

#!/usr/bin/php -q 
<?php 
    $socket = stream_socket_client('udp://225.0.0.0:50000'); 
    for($i=0;$i<strlen($argv[1]);$i++) $b.="\0\0\0".$argv[1][$i]; 
    fwrite($socket,$b,strlen($argv[1])*4); 
    fclose($socket); 
?> 

내게는 tcpdump의 출력을 제공합니다 : I 작품 내 지역 컴퓨터에서 실행되는 일부 PHP 코드를 가지고 0.50000 : UDP, 길이 36

나는 다음과 같은 코드를 가진 원격 iOS에서 같은 결과를 얻으려고 :

- (void)broadcast:(NSString *)dx { 
    NSData* data=[dx dataUsingEncoding:NSUTF8StringEncoding]; 
    NSLog(@"Broadcasting data: %@", dx); 
    int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 

    struct sockaddr_in addr4client; 
    memset(&addr4client, 0, sizeof(addr4client)); 
    addr4client.sin_len = sizeof(addr4client); 
    addr4client.sin_family = AF_INET; 
    addr4client.sin_port = htons(PORT); 
    addr4client.sin_addr.s_addr = htonl(INADDR_BROADCAST); 

    int yes = 1; 
    if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (void *)&yes, sizeof(yes)) == -1) { 
    NSLog([NSString stringWithFormat:@"Failure to set broadcast! : %d", errno]); 
    } 

    char *toSend = (char *)[data bytes]; 
    if (sendto(fd, toSend, [data length], 0, (struct sockaddr *)&addr4client,  sizeof(addr4client)) == -1) { 
    NSLog([NSString stringWithFormat:@"Failure to send! : %d", errno]); 
    } 
    close(fd); 
} 
내게는 tcpdump에서 다음과 같은 출력을 제공3210

:

19 : UDP, 길이 9

기본적으로 확인을 보이지만 석영에 도착하지 : 01 : broadcasthost.50000이> 22.776192 IP 10.0.1.4.60643 작곡가는 어떤 이유로 IP 주소 나 'broadcasthost'대신에 무엇인가 있어야한다고 생각합니다.

아이디어가 있으십니까?

답변

0

iOS에서 실행되는 AsyncSocket (google it, googlecode), 매우 잘 테스트 된 objective-c 코드를 사용하는 것이 좋습니다.

그런 식으로 NSData 객체를 사용하여 데이터를 매우 쉽게 보낼 수 있습니다. AsyncSocket은 어려운 부분을 관리합니다.

이것이 옵션이 아니라면 CFSocket을 사용해야합니다. 당신이하고있는 일은 이미 당신을 위해 작성된 코드 인 CFSocket을 구현하는 것입니다.

+0

설명서의 "AsyncSocket 사용"부분이 비어있어 적절한 설명서를 찾을 수 없습니다. 이미 전송 코드를 작성 했으므로 사용시 이점이 있습니까? 나는이 방송보다 더 많은 것을 필요로하지 않는다. – Patrick

+0

매우 사용하기 쉽습니다. 데이터를 생성하고 writeData를 호출하는 것 외에는 코드를 작성할 필요가 없습니다. yourData withTimeout : -1 –

+0

감사합니다. 런타임 중에 오류가 발생하여 소켓을 사용하기 전에 코드를 사용했습니다. 다음 번에는 그것을 명심하십시오. – Patrick

관련 문제