|
楼主 |
发表于 2010-12-17 09:15:05
|
显示全部楼层
后来和上位机开发人员商量,决定采用UDP通行方式,由于下位机上电时需要主动去连接上位机,需要收、发UDP数据包,我这种不同于例程上的UDP SERVER例程和UDP CLIENT例程,我的这个任务如下编写,有一个奇怪的问题,如果先发送一个数据包给上位机则无法再收数据包,如何做到收发独立,谢谢!
程序如下:
ALIGN(4) static const char send_data[] = "This is UDP Client from RT-Thread.\n"; /* 发送用到的数据 */
void rt_udp_rec_thread_entry(void* parameter)
{
int socket_handle;
struct sockaddr_in my_addr,remote_addr,client_addr;
uint16_t port;
W_B *TempW_B;
int data_len;
rt_err_t result;
uint8_t *msg;
uint16_t usTemp;
uint8_t ucTemp;
rt_uint32_t addr_len;
fd_set readset;
struct timeval to;
uint32_t ulLoop=0;
to.tv_sec =1;
to.tv_usec =0;
// 创建一个socket,类型是SOCK_DGRAM,UDP类型
if ((socket_handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
{
#if(BSP_DEBUG>0)
//创建socket失败
rt_kprintf("Socket_rec create error\n");
#endif
while(1)
{
rt_thread_delay(RT_TICK_PER_SECOND);
}
}
//初始化预连接的服务端地址
remote_addr.sin_family = AF_INET;
port=Flash_Sys_Buf[FLASH_TCP_PORT+1]<<8;
port+=Flash_Sys_Buf[FLASH_TCP_PORT];//8084端口
remote_addr.sin_port = htons(port);
TempW_B=(W_B *)&Flash_Sys_Buf[FLASH_TCP_SERVER_IP];//192.168.0.103
remote_addr.sin_addr.s_addr= TempW_B->dword;
rt_memset(&(remote_addr.sin_zero), 0, sizeof(remote_addr.sin_zero));
//初始化自己的绑定地址
my_addr.sin_family = AF_INET;
port=Flash_Sys_Buf[FLASH_TCP_PORT+1]<<8;
port+=Flash_Sys_Buf[FLASH_TCP_PORT];//8084端口
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr= INADDR_ANY;//自己的端口
rt_memset(&(my_addr.sin_zero), 0, sizeof(my_addr.sin_zero));
//绑定socket到服务端地址
if (bind(socket_handle,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1)
{
#if(BSP_DEBUG>0)
//绑定地址失败
rt_kprintf("Bind error\n");
#endif
while(1)
{
rt_thread_delay(RT_TICK_PER_SECOND);
}
}
// sendto(socket_handle, send_data, strlen(send_data),0,
// (struct sockaddr *)&remote_addr, sizeof(struct sockaddr));//如果先发送一个数据包则无法收到数据包,屏蔽则不存在这个问题
while(1)
{
addr_len = sizeof(struct sockaddr);
FD_ZERO(&readset);
FD_SET(socket_handle, &readset);
if(lwip_select(socket_handle+1, &readset, 0, 0, 0)==0)
{
continue;
}
data_len = recvfrom(socket_handle, Eth_Buf, sizeof(Eth_Buf),MSG_DONTWAIT,
(struct sockaddr *)&client_addr, &addr_len);
if( data_len > 0 )
{
if(data_len==sizeof(Eth_Buf))
{
data_len--;
}
Eth_Buf[data_len]='\0';
#if(BSP_DEBUG>0)
//输出接收的数据
rt_kprintf("\n(%s , %d) said : ",inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port));
rt_kprintf("%s\n",Eth_Buf);
#endif
}
sendto(socket_handle, send_data, strlen(send_data),MSG_DONTWAIT,
(struct sockaddr *)&remote_addr, sizeof(struct sockaddr));
rt_thread_delay(RT_TICK_PER_SECOND);
rt_thread_delay(RT_TICK_PER_SECOND);
}
} |
|