|
|
分析程序,发现几个问题(在程序中标注为//--):
(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--;
?}
??
??? }???
} |
|