|
分析程序,发现几个问题(在程序中标注为//--):
(1)UDP服务器和客户端命名歧义,这个是小问题了;
(2)couter_byte问题。
因为局部变量couter_byte在前面定义时已初始化为5,所以,即使 if(rec_buffer[0]=='A')里面收到第一字节不等于A,应该也会执行下面while(couter_byte!=0) 内程序,但事实上却不会执行这里,为什么?
如果改动程序一处,如下:
if(rec_buffer[0]=='A')
couter_byte+=1; //--couter_byte在前面定义时已初始化为5
那么,按逻辑这里couter_byte应该为大于5的数,但实验测试却是发送1次!搞不明白了,请高手帮分析!
(3)这个问题比较蹊跷,如果把uint8 rec_buffer[100];定义为全局变量,那么用UDP测试工具测试时,发送请求数据后,板子的程序就出现异常,跳到:
Undefined
B Undefined
它作为全局变量也只是TaskD一个任务去改变它而已啊,没有重入问题吧?
附程序:
void TaskD(void *pdata)
{
uint8 add[36]={"ZLGMCUyhbabcdefghijklmnopqrstuvwxyz"};
uint8 add1[10]={"123456789"};
uint8 rec_buffer[100];
SOCKET s;
uint8 couter_byte=5; //--注意此处初始化为5
//uint8 Temp;
int rec_coute,send_coute;
uint16 iii;
struct sockaddr servaddr,clientaddr;
OSTimeDly(60);
servaddr.sin_family=0;
servaddr.sin_addr[0]=192; //--设置客户端IP,但是命名为servaddr让人误解!
servaddr.sin_addr[1]=168;
servaddr.sin_addr[2]=0;
servaddr.sin_addr[3]=55;
servaddr.sin_port=1026;
OSTimeDly(60);
s=*socket( 0, SOCK_DGRAM, UDP_PROTOCOL);
clientaddr.sin_family=0;
clientaddr.sin_addr[0]=192;
clientaddr.sin_addr[1]=168;
clientaddr.sin_addr[2]=0;
clientaddr.sin_addr[3]=174;
clientaddr.sin_port=1025;
iii=bind( (SOCKET * )&s, (struct sockaddr*)&clientaddr,sizeof(clientaddr));
while (1)
{
rec_coute=recvfrom( s, rec_buffer, 100, 0, (struct sockaddr*)&servaddr, &iii );
if(rec_coute>0)
{
if(rec_buffer[0]=='A')
couter_byte=5; //--couter_byte在前面定义时已初始化为5
else
send_coute=sendto(s, rec_buffer, rec_coute, 0, (struct sockaddr*)&servaddr, sizeof(servaddr) );
}
//--因为局部变量couter_byte在前面定义时已初始化为5,
//--所以,即使 if(rec_buffer[0]=='A')里面收到第一字节不等于A
//--应该也会执行下面while内程序,但事实上却不会执行这里,为什么?
while(couter_byte!=0)
{
send_coute=sendto(s, add, 34, 0, (struct sockaddr*)&servaddr, sizeof(servaddr) );
if(send_coute==34)
OSTimeDly(40);
else
send_coute=sendto(s, add1, 9, 0, (struct sockaddr*)&servaddr, sizeof(servaddr) );
OSTimeDly(40);
couter_byte--;
}
}
} |
|