|
楼主 |
发表于 2011-2-24 13:38:53
|
显示全部楼层
void start_udpserv(void* paramemter)
{
int ret;
int udpsock;
int bytes_read;
unsigned int timeout;
char *recv_data;
unsigned char send_bytes;
struct sockaddr_in server_addr, client_addr;
rt_uint32_t addr_len;
fd_set readset;
timeout=1;
/* 分配接收用的数据缓冲 */
recv_data = rt_malloc(1024);
if (recv_data == RT_NULL)
{
/* 分配内存失败,返回 */
rt_kprintf("No memory\n");
return;
}
/* 创建一个socket,类型是SOCK_DGRAM,UDP类型 */
if ((udpsock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
rt_kprintf("Socket error\n");
/* 释放接收用的数据缓冲 */
rt_free(recv_data);
return;
}
lwip_setsockopt(udpsock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
/* 初始化服务端地址 */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PARA.PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
rt_memset(&(server_addr.sin_zero),0, sizeof(server_addr.sin_zero));
/* 绑定socket到服务端地址 */
if (bind(udpsock,(struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1)
{
/* 绑定地址失败 */
rt_kprintf("Bind error\n");
/* 释放接收用的数据缓冲 */
rt_free(recv_data);
return;
}
rt_kprintf("UDPServer Waiting for client on port %d...\n",PARA.PORT);
while (true)
{
addr_len = sizeof(struct sockaddr);
FD_ZERO(&readset);
FD_SET(udpsock, &readset);
if( lwip_select(udpsock+1, &readset, 0, 0, 0) == 0 )
continue;
rt_mutex_take(&setup_data_buf_mutex,RT_WAITING_FOREVER);
/* 从sock中收取最大1024字节数据 */
bytes_read = recvfrom(udpsock, recv_data, 1024, 0,
(struct sockaddr *)&client_addr, &addr_len);
/* UDP不同于TCP,它基本不会出现收取的数据失败的情况,除非设置了超时等待 */
rt_mutex_release(&setup_data_buf_mutex);
// rt_kprintf("udp server timeout!\n");
//
if(bytes_read>0)
{
IWDG_ReloadCounter();
recv_data[bytes_read] = '\0'; /* 把末端清零 */
if(PARA.LED_Mode ==2)
{
LED_Ctr(1);
}
rt_mutex_take(&setup_data_buf_mutex,RT_WAITING_FOREVER);
send_bytes = eth_data_handle(recv_data,bytes_read,SendBuffer); //数据处理
rt_mutex_release(&setup_data_buf_mutex);
if(send_bytes>=5)
{
// client_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
rt_mutex_take(&setup_data_buf_mutex,RT_WAITING_FOREVER);
sendto(udpsock, SendBuffer, send_bytes, 0,(struct sockaddr *)&client_addr, sizeof(struct sockaddr));
rt_mutex_release(&setup_data_buf_mutex);
// rt_kprintf("send data %s: ",SendBuffer);
// rt_thread_delay(1);
}
/* 输出接收的数据 */
if(PARA.LED_Mode ==2)
{
LED_Ctr(0);
}
}
// rt_thread_delay(1);
}
lwip_close(udpsock);
/* 释放接收用的数据缓冲 */
rt_free(recv_data);
rt_kprintf("udp server error!\n");
return;
}
把例程改为这样子。eth_data_handle(recv_data,bytes_read,SendBuffer); //数据处理
这函数是数据处理的
这样有什么问题吗 |
|