1

現在、UDP パケットを到達不能な宛先 (バインドされていないローカル ポートなど) に送信すると、長さ 0 の UDP パケットの受信と区別できないようなイベントが発生します。

私はこのようなソケットを作成しています:

CFSocketContext socketContext = { 0, (__bridge void *)self, CFRetain, CFRelease, NULL };
socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, kCFSocketDataCallBack, (CFSocketCallBack)onReceivedData, &socketContext);
NSData* localEndPointData = [[IpEndPoint ipEndPointAtUnspecifiedAddressOnPort:specifiedLocalPort] sockaddrData];
CFSocketSetAddress(socket, (__bridge CFDataRef)localEndPointData);
CFSocketConnectToAddress(socket, (__bridge CFDataRef)[remoteEndPoint sockaddrData], -1);

次のようなイベントを受け取ります。

void onReceivedData(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) {
    if(type == kCFSocketDataCallBack && CFDataGetLength((CFDataRef)data) == 0) {
        NSLog("Received empty packet");
    }
}

リッスンしているソケットがあれば、specifiedLocalPort正常に動作します。データを送信しても受信イベントはトリガーされず、データを受信すると受信イベントがトリガーされます。でリッスンしているソケットがない場合specifiedLocalPort、データを送信すると、空の udp パケットが受信されたと主張する受信イベントがトリガーされます。

この動作を引き起こすために、私は愚かなことをしていますか?「宛先に到達できません」と「宛先から空のUDPパケットが送信されました」を区別するにはどうすればよいですか?

4

1 に答える 1