我是用的是TMDSIDK574,bios_6_76_03_01,ndk_3_61_01_01,pdk_am57xx_1_0_17。我想要在TI-RTOS上面同时使用IPv4和IPv6套接字,不知道是否有人实现过IPv6套接字编程啊。我在官方例程没有找到如何实现IPv6的,我在cfg文件里面只看到有个“enable IPv6”,我也阅读了“ TI Network Developer's Kit (NDK) API Reference Guide:IP Version 6 (IPv6) Stack API”关于IPv6的描述,不知道是否可以静态设置IPv6不,是否能够给出IPv6套接字编程的一些示例啊。
我试着用socket编程,应该是PC IPv6地址与开发板不在网段,通信不了,但是我也查看不到板子的IPv6地址,也没有发现任何可以静态配置IPv6地址的地方。
Shine:
请看一下下面的链接是否 有帮助。
processors.wiki.ti.com/…/IPv6_Support
software-dl.ti.com/…/ipv6_8c.html
user4839655:
回复 Shine:
您好,下面是我写的关于UDP IPv6的代码:
Void sock_udp_ipv6(UArg arg0, UArg arg1){ sleep(5); Task_Params params; Error_Block eb; SOCKET sock; int dev_index = 1; int status; struct addrinfo hints; struct addrinfo *results1 = NULL; int value; char port[8]; IP6N srcaddress; static char src[] = "fe80::a00:9ff:fedc:aaaa"; if(IPv6StringToIPAddress((char *)&src[0],(IP6N*)&srcaddress)==-1) { UART_printf("\error.\n"); } IPv6Init(); IPv6AddAddress(1,srcaddress,64,INFINITE_LT ,INFINITE_LT ,0);
fdOpenSession (TaskSelf ()); #if 1 if ((sock = socket (AF_INET6, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) { UART_printf("\n sssss.\n"); return; }
static char dst[] = "fe80::a00:9ff:fedc:abcd"; struct sockaddr_in6 stSockAdr;
stSockAdr.sin6_family = AF_INET6; stSockAdr.sin6_port = NDK_htons(8899); // inet_ntop(AF_INET6, (char *)&dst[0], &stSockAdr.sin6_addr, sizeof(stSockAdr.sin6_addr)); if(IPv6StringToIPAddress((char *)&dst[0],(IP6N*)&stSockAdr.sin6_addr)==-1) { UART_printf("\error.\n"); }
struct timeval to; to.tv_sec = 3; to.tv_usec = 0; if(setsockopt( sock, SOL_SOCKET, SO_SNDTIMEO, &to, sizeof( to ))== SOCKET_ERROR){ UART_printf("\n er.\n"); } if(setsockopt( sock, SOL_SOCKET, SO_RCVTIMEO, &to, sizeof( to ))== SOCKET_ERROR){ UART_printf("\n er.\n"); }
int slen = sizeof(stSockAdr);
int result = 0,z = -5; char buffer[5] = "hello"; while(1){ result = sendto(sock,buffer,sizeof(buffer),0,(struct sockaddr *)&stSockAdr,slen); z= fdError(); UART_printf("write %d bytes\n", result); UART_printf("z=%d bytes\n", z);
} #endif // Close the file session fdCloseSession(TaskSelf());}
但是在调试sendto函数的时候进入到
NETIF_DEVICE* NIMUFindByIndex (uint32_t index){ NETIF_DEVICE* ptr_device;
/* Get the head of the list. */ ptr_device = (NETIF_DEVICE *)list_get_head ((NDK_LIST_NODE**)&nimu_mcb.devices); while (ptr_device != NULL) { /* Did we get the match? */ if (ptr_device->index == index) return ptr_device;
/* Go to the next element. */ ptr_device = (NETIF_DEVICE*)list_get_next ((NDK_LIST_NODE*)ptr_device); }
/* No matching entry found. */ return NULL;}
每次返回的都是NULL,导致sendto函数执行sendto_error:
sendto_error: /* Unlock the fd with error */ fdint_unlockfd(pfd, error);
llExit();
return (SOCKET_ERROR);
发数据的时候发送不出去。fdError()返回的值是22。
Shine:
回复 user4839655:
我将您的问题发布在E2E英文技术论坛上,将由资深的英文论坛工程师为您提供帮助。请关注下面的帖子。
e2e.ti.com/…/923838