新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2016-11-30
- 在线时间
- 10 小时
|
5金钱
本帖最后由 zhyocean 于 2016-12-1 21:55 编辑
我使用探索者的开发板更改一个代码,是使用RAM_TCP客户端为模版的,现在遇到一个问题,想请教一下各位大神。这边的客户端需要通过网络循环发送“1;20100001”,“1;20100002”,“1;20100003”这一类的字符串,每次只能发送一个,发送一个完成后服务器那边会把链接断掉,然后下一次发送需要重新握手链接。现在问题是,我在发送的时候,程序会随机的在发送后面某一个一个字符串的时候死掉。即使重新链接也没作用。有的时候第二个就死,有时候第六个死,随机的。下面是代码。
[mw_shl_code=c,true]void tcp_client_test()
{
struct tcp_pcb *tcppcb; //定义一个TCP服务器控制块
struct ip_addr rmtipaddr; //远端ip地址
u8 *tbuf;
u8 res=0;
u8 t=0;
tcp_client_set_remoteip();//先选择IP
tbuf=mymalloc(SRAMIN,200); //申请内存
if(tbuf==NULL)return ; //内存申请失败了,直接退出
tcppcb=tcp_new(); //创建一个新的pcb
if(tcppcb) //创建成功
{
IP4_ADDR(&rmtipaddr,lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);
tcp_connect(tcppcb,&rmtipaddr,TCP_CLIENT_PORT,tcp_client_connected); //连接到目的地址的指定端口上,当连接成功后回调tcp_client_connected()函数
}else res=1;
while(res==0)
{
get_inquire_string(num);
tcp_client_sendbuf=string_inquire;
if(tcp_client_flag&1<<5)//是否连接上?
{
tcp_client_flag|=1<<7;//标记要发送数据
}
if(tcp_client_flag&1<<6)//是否收到数据
{
OLED_ShowString(90,48,tcp_client_recvbuf,12,1);//显示接收到的数据
OLED_Refresh_Gram();
tcp_client_flag&=~(1<<6);//标记数据已经被处理了.
break;
}
lwip_periodic_handle();
delay_ms(2);
t++;
if(t==200)
{
if((tcp_client_flag&1<<5)==0)//未连接上,则尝试重连
{
tcp_client_connection_close(tcppcb,0);//关闭连接
tcppcb=tcp_new(); //创建一个新的pcb
if(tcppcb) //创建成功
{
IP4_ADDR(&rmtipaddr,lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);
tcp_connect(tcppcb,&rmtipaddr,TCP_CLIENT_PORT,tcp_client_connected);//连接到目的地址的指定端口上,当连接成功后回调tcp_client_connected()函数
}
if((tcp_client_flag&1<<5)==0)
{
tcp_client_connection_close(tcppcb,0);//关闭连接
tcppcb=tcp_new(); //创建一个新的pcb
if(tcppcb) //创建成功
{
IP4_ADDR(&rmtipaddr,lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);
tcp_connect(tcppcb,&rmtipaddr,TCP_CLIENT_PORT,tcp_client_connected);//连接到目的地址的指定端口上,当连接成功后回调tcp_client_connected()函数
}
if((tcp_client_flag&1<<5)==0)
{
num--;
break;
}
}
}
t=0;
LED0=!LED0;
}
}
num++;if(num>9) num=0;
tcp_client_connection_close(tcppcb,0);//关闭TCP Client连接
myfree(SRAMIN,tbuf);
}
[/mw_shl_code]
|
最佳答案
查看完整内容[请看2#楼]
这个例程在连接的时候就是采用回调函数的方式去连接的 发送函数 接收函数都是采用回调函数 速度很慢 我试了慢慢发送 慢慢接收 不会有问题 发送快了就反应不过来了 我觉得吧 你还是用NETCONNECT那个例程比较稳妥 不过里边必须用UCOS
|