0

我不确定这是否是问这个问题的正确地方。如果没有,我会删除它...

无论如何,我已经为 LPC1788 制作了 enc28j60 的驱动程序,我正在尝试从 iOS 向它发送 UDP 消息。发送失败。通信由 iOS 发送 ARP 请求开始。在 LPC 上,我做出响应并将其发送到 iOS MAC 地址。我已经阅读了 ARP 的 RFC 并按规范创建了数据包,但由于某种原因,我没有在网络嗅探器中看到响应。

这肯定表明我的响应例程不起作用,如果当我从 OSX(nc -u xxx.xxx.xxx.xxx 端口)发送正确到达 LPC 的 udp 消息时没有这种情况。

我观察到的不同之处在于,OSX 发送了 42 字节长的请求并获得了 60 字节长的响应,最后 18 字节为 0(填充字节),而 iOS 发送了 60 字节长的请求,最后 4 字节为90 eb 58 96.

我试图用所有填充零来响应,并复制这 4 个字节,但两种方法都不起作用。

OSX ARP(req, res) 和 UDP 包在嗅探器中可见。iOS ARP req 在嗅探器中可见,仅此而已。

任何想法 ?

编辑:

IOS代码:

CFSocketRef sock = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, NULL, NULL);
if ( sock == NULL) {
    NSLog(@"CfSocketCreate Failed");
}else{
    struct sockaddr_in remoteAddress;
    memset(&remoteAddress, 0, sizeof(remoteAddress));
    remoteAddress.sin_family = AF_INET;
    remoteAddress.sin_len = sizeof(remoteAddress);
    remoteAddress.sin_port = htons(1200);
    remoteAddress.sin_addr.s_addr = inet_addr("192.168.5.8");
    char data[] = "test";
    NSData *message_data = [NSData dataWithBytes:&data length:4];
    NSData* remoteAddressData = [NSData dataWithBytes:&remoteAddress length:sizeof(remoteAddress)];
    CFSocketError er = CFSocketSendData(sock, (__bridge CFDataRef)(remoteAddressData), (__bridge CFDataRef)message_data, 0);
}

LPC 代码:

void make_arp_response (uint8_t *buffer)
{
uint16_t pos = sizeof (ethernet.source)+sizeof (ethernet.dest);
uint8_t type[2];
type[0] = ARP_TYPE>>8;
type[1] = (uint8_t)ARP_TYPE;

memcpy (buffer+pos, &type, sizeof (ethernet.type)); pos = sizeof(ethernet); //set ethernet type
arp.hwType = ((0x01)<<8);
memcpy (buffer+pos, &arp.hwType, sizeof (arp.hwType)); pos += sizeof(arp.hwType); 
arp.protocol[0] = 0x08;
arp.protocol[1] = 0x00;
memcpy (buffer+pos, &arp.protocol, sizeof (arp.protocol)); pos += sizeof(arp.protocol); 
memcpy (buffer+pos, &arp.macLen, sizeof (arp.macLen)); pos += sizeof(arp.macLen); 
memcpy (buffer+pos, &arp.ipLen, sizeof (arp.ipLen)); pos += sizeof(arp.ipLen); 
arp.opCode = (0x02) << 8;
memcpy (buffer+pos, &arp.opCode, sizeof (arp.opCode)); pos += sizeof(arp.opCode); 

memcpy (buffer+pos, &macaddr, sizeof (arp.sourceMac)); pos += sizeof(arp.sourceMac); 
memcpy (buffer+pos, &arp.destIP, sizeof (arp.sourceIp)); pos += sizeof(arp.sourceIp); 
memcpy (buffer+pos, &arp.sourceMac, sizeof (arp.destMac)); pos += sizeof(arp.destMac); 
memcpy (buffer+pos, &arp.sourceIp, sizeof (arp.destIP));    

enc28j60_PacketSend(sizeof (ethernet)+sizeof (arp),buf);
}

更新:

看来这不仅仅是 iOS 的问题,而是 Wifi 客户端的问题。我试图通过wifi从Windows笔记本电脑发送UDP,它也发送ARP请求,但响应和UDP数据包不知何故丢失了。看来我的路由器对我的 LPC 有一些问题 :) 我还尝试将 Arduino 连接到同一个 enc28j60 板而不是 LPC,并且 UDP 通信有效。arduino 的库可以在 NET 的某个地方找到。arduino 代码中的 ARP 响应在我看来是一样的。

更新 2:

ARP请求:

ff ff ff ff ff ff 85 29 fb 0d c2 71 08 06 00 01
08 00 06 04 00 01 85 29 fb 0d c2 71 c0 a8 05 28
00 00 00 00 00 00 c0 a8 05 08 00 00 00 00 00 00
00 00 00 00 00 00 00 00 25 a9 c3

阿尔普回应:

85 29 fb 0d c2 71 7b c3 53 a6 9c 55 08 06 00 01
08 00 06 04 00 02 7b c3 53 a6 9c 55 c0 a8 05 08
85 29 fb 0d c2 71 c0 a8 05 28

该响应在通过线路发送后立即从 LPC 中转储。我没有在嗅探器中看到它。

4

0 回答 0