static void
udpecho_thread(void *arg)
{
int sock = -1;
char *recv_data;
struct sockaddr_in udp_addr,seraddr;
int recv_data_len;
socklen_t addrlen;
DEBUG_P("±¾µØ¶Ë¿ÚºÅÊÇ%d\n\n",LOCAL_PORT);
while(1)
{
recv_data = (char *)pvPortMalloc(RECV_DATA);
if (recv_data == NULL)
{
DEBUG_P("No memory\n");
goto __exit;
}
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
{
DEBUG_P("Socket error\n");
goto __exit;
}
udp_addr.sin_family = AF_INET; //IPv4
udp_addr.sin_addr.s_addr = INADDR_ANY;
udp_addr.sin_port = htons(LOCAL_PORT);
memset(&(udp_addr.sin_zero), 0, sizeof(udp_addr.sin_zero));
if (bind(sock, (struct sockaddr *)&udp_addr, sizeof(struct sockaddr)) == -1)
{
DEBUG_P("Unable to bind\n");
goto __exit;
}
while(1)
{
recv_data_len=recvfrom(sock,recv_data,
RECV_DATA,0,
(struct sockaddr*)&seraddr,
&addrlen);
DEBUG_P("receive from %s\n",inet_ntoa(seraddr.sin_addr));
#if UDP_SPEED_UP
SetSpeedUpInfo(&SpeedUpInfo, LOCAL_PORT);
#endif
sendto( sock,recv_data,
recv_data_len,0,
(struct sockaddr*)&seraddr,
addrlen);
}
__exit:
if (sock >= 0) closesocket(sock);
if (recv_data) free(recv_data);
}
}