tcpclient使用finsh的方式可以成功,放到开机创建里就无法成功

发布于 2019-10-21 17:01:50
tcpclient使用finsh的方式可以成功,放到开机创建里就无法成功。使用的是静态ip
以下是程序:
int main(void)
{
int count = 1;



StartTcpClient();

/* set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);

while (count++)
{
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED0_PIN, PIN_LOW);
rt_thread_mdelay(500);
}

return RT_EOK;
}

//TEST create a rt thread
#define THREAD_PRIORITY 25
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 5

static rt_thread_t tid1 = RT_NULL;

/* 线程 1 的入口函数 */
static void thread1_entry(void *parameter)
{
rt_uint32_t count = 0;

while (1)
{
/* 线程 1 采用低优先级运行,一直打印计数值 */
rt_kprintf("thread1 count: %d\n", count ++);
rt_thread_mdelay(500);
}
}

#define BUFSZ 1024
static rt_thread_t tid_TcpClient = RT_NULL;
/* 线程 tcpclient 的入口函数 */
void thread_tcpclient_entry(void *parameter)
{
int ret;
char *recv_data;
struct hostent *host;
int sock, bytes_received;
struct sockaddr_in server_addr;
const char *url="192.168.0.166";
int port=8087;

/* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */
host = gethostbyname(url);
/* 分配用于存放接收数据的缓冲 */
recv_data = rt_malloc(BUFSZ);
if (recv_data == RT_NULL)
{
rt_kprintf("No memory\n");
return;
}

/* 初始化预连接的服务端地址 */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

/* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
/* 创建socket失败 */
rt_kprintf("Socket error\n");

/* 释放接收缓冲 */
rt_free(recv_data);
return;
}

/* 初始化预连接的服务端地址 */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

/* 连接到服务端 */
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
{
/* 连接失败 */
rt_kprintf("Connect fail!\n");
closesocket(sock);

/*释放接收缓冲 */
rt_free(recv_data);
return;
}
else
{
/* 连接成功 */
rt_kprintf("Connect successful\n");
}

// int res=-1;
// rt_uint32_t count = 0;
// do
// {
// res= socket(AF_INET, SOCK_STREAM, 0);
// if(res==-1)
// {
// rt_kprintf("Socket error\n");
// }
//
// res=connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
// if(res==-1)
// {
// closesocket(sock);
// rt_kprintf("thread count: %d\n", count ++);
// }
//
// rt_thread_mdelay(500);
//
//
// }while(res==-1);
while (1)
{
/* 从sock连接中接收最大BUFSZ - 1字节数据 */
bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
if (bytes_received < 0)
{
/* 接收失败,关闭这个连接 */
closesocket(sock);
rt_kprintf("\nreceived error,close the socket.\r\n");

/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
else if (bytes_received == 0)
{
/* 默认 recv 为阻塞模式,此时收到0认为连接出错,关闭这个连接 */
closesocket(sock);
rt_kprintf("\nreceived error,close the socket.\r\n");

/* 释放接收缓冲 */
rt_free(recv_data);
break;
}

/* 有接收到数据,把末端清零 */
recv_data[bytes_received] = '\0';

/* 在控制终端显示收到的数据 */
rt_kprintf("\nReceived data = %s ", recv_data);

/* 发送数据到sock连接 */
ret = send(sock, send_data, strlen(send_data), 0);
if (ret < 0)
{
/* 接收失败,关闭这个连接 */
closesocket(sock);
rt_kprintf("\nsend error,close the socket.\r\n");

rt_free(recv_data);
break;
}
else if (ret == 0)
{
/* 打印send函数返回值为0的警告信息 */
rt_kprintf("\n Send warning,send function return 0.\r\n");
}
}


}



static void StartTcpClient(void)
{
/* 创建线程 1,名称是 thread1,入口是 thread1_entry*/
tid1 = rt_thread_create("thread1",
thread_tcpclient_entry, RT_NULL,
THREAD_STACK_SIZE,
THREAD_PRIORITY, THREAD_TIMESLICE);

/* 如果获得线程控制块,启动这个线程 */
if (tid1 != RT_NULL)
rt_thread_startup(tid1);


}
MSH_CMD_EXPORT(thread_tcpclient_entry, a tcp client sample test);

有没有人遇到这种情况呢。以下是控制台输出
Connect fail!


msh />
msh />
msh />ping 192.168.0.166
60 bytes from 192.168.0.166 icmp_seq=0 ttl=64 time=2 ms
60 bytes from 192.168.0.166 icmp_seq=1 ttl=64 time=1 ms
60 bytes from 192.168.0.166 icmp_seq=2 ttl=64 time=1 ms
60 bytes from 192.168.0.166 icmp_seq=3 ttl=64 time=1 ms
msh />th
thread_tcpclient_entry
msh />thread_tcpclient_entry
Connect successful

是不是创建任务之前要等待什么网络状态之类的呢?



查看更多

关注者
0
被浏览
706
1 个回答
storm
storm 2019-10-21
debug一天终于找到问题了,有个叫phy_monitor_thread_entry的线程,他不起来,就无法创建tcpclient成功,他起来之后就可以了,可以通过以下代码确定网络连接状态:
struct netdev *myNetdev;

myNetdev =(netdev_get_by_family(AF_INET));

int resNetDev=(netdev_is_link_up(myNetdev));


resNetDev为1时候网络就起来了,就可以创建tcpclient了
最后 希望官方的大神们,创建例程时候,多考虑以下,不要通过finsh可以跑了,就认为ok了。别挖坑,让后面的萌新怎么入门呢,注社区原来越好
hualongguang
hualongguang 2020-06-29
storm 发表于 2019-10-21 17:53
debug一天终于找到问题了,有个叫phy_monitor_thread_entry的线程,他不起来,就无法创建tcpclient成功,他 ...


您好,我也遇到这个问题了,而且我用了你的方法resNetDev的值一直为0,你说的这个phy_monitor_thread_entry没运行起来是个什么意思,这个不是在初始化的时候运行的吗,能具体说说您的解决方法吗,万分感谢!

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友