2009-11-23 5 views
0

WiFI를 통해 UDP를 통해 간단한 패킷을 보내려면 sendto()recvfrom()을 사용하고 있습니다.iphone 문제가 UDP 패킷을 받고 있습니다.

가 나는 두 개의 전화, 시뮬레이터를 사용하여 시도했다, 내가지고있어 결과는 다음과 같습니다 전화에서 전송

패킷 -> 시뮬레이터 시뮬레이터에서 보낸 패킷에 의해 받았다 -> 시뮬레이터에 recvfrom 차단 상태를 유지합니다. 휴대 전화에서 보낸 패킷 -> 다른 전화 recvfrom은 계속 차단됩니다.

시뮬레이터/맥이 패킷을 수신 할 수 있기 때문에 디버깅을 시작하는 방법을 모르지만 전화가 메시지를 받고있는 것처럼 보이지 않습니다.

약간의 차이는 있지만 내 네트워크의 MTU 아래로 패킷을 유지해야합니까? 또는 OS 또는 일부 다른 하위 소프트웨어에서 단편화를 처리합니까?

업데이트 : 패킷 크기 및 구조를 포함하는 것을 잊었습니다. I는 송신있어 :

typedef struct PacketForTransmission { 
    int32_t packetTypeIdentifier; 
    char data[64]; // size to fit my biggest struct 
} PacketForTransmission; 

있는 숯 데이터 [64]이다 :

typedef struct PacketHeader{ 
    uint32_t identifier; 
    uint32_t datatype; 
} PacketHeader; 

typedef struct BasePacket{ 
    PacketHeader header; 
    int32_t cardValue; 
    char sendingDeviceID[41]; //dont forget to save room for the NULL terminator! 
} BasePacket; 

typedef struct PositionPacket{ 
    BasePacket basePacket; 
    int32_t x; 
    int32_t y; 
} PositionPacket; 

전송 패킷 같다 :

PositionPacket packet; 
bzero(&packet, sizeof(packet)); 
//fill packet with it's associated data 

PacketForTransmission transmissionPacket; 
transmissionPacket.packetTypeIdentifier = kPositionPacketType; 
memcpy(&transmissionPacket.data, (void*)&packet, sizeof(packet)); //put the PositionPacket into data[64] 

size_t sendResult = sendto(_socket, &transmissionPacket, sizeof(transmissionPacket), 0, [address bytes], [address length]); 
NSLog(@"packet sent of size: %i", sendResult); 

패킷을 잡 것은 같다 :

while(1){ 
    char dataBuffer[8192]; 
     struct sockaddr addr; 
    socklen_t socklen = sizeof(addr); 
    ssize_t len = recvfrom(_socket, dataBuffer, sizeof(dataBuffer), 0, &addr, &socklen); //continues blocking here 
     NSLog(@"packet recieved of length: %i", len); 

    //do some more stuff 
} 
+1

코드를 게시하십시오. –

+0

현재 사용중인 포트에 관한 정보는 무엇입니까? –

+0

나는 bonjour를 사용하고 있으므로 포트는 "사용 가능한 모든 포트"입니다. – SooDesuNe

답변

0

나는 당신이 생각할 수 없다고 생각합니다. OS가 당신이 듣고있는 포트를 알지 못하게해야합니다. 들어오는 패킷의 포트 번호는 일반적으로 패킷이 전달되어야하는 위치를 결정하기 위해 프로세스가 바인드 된 포트 번호와 비교됩니다.

고정 포트 번호를 설정하고 (49153 또는 임의의 것과 같은 무작위 16 비트 부호없는 정수를 선택하고) 양측에서이를 사용하십시오.

네트워크 리소스의 동적 검색을 허용하는 Bonjour를 사용하는 것에 대해 언급했지만 여전히 가치있는 시도라고 생각합니다.

관련 문제