微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > cc3000 socket api, accept, send问题

cc3000 socket api, accept, send问题

时间:10-02 整理:3721RD 点击:

我在stm32上连接cc3000模组, 现在wifi网络已调通, dhcp分配了ip,  pc能ping到该设备

现在问题是,利用socket api写server程序时,  socket 创建后, bind, listen,  accept,  本来没有客户连接时, accept应该是一直block的, 但是运行一段时间后,并且没有客户端连接该server, accept就会自动返回了,返回值为-57,  如果马上又客户端连接,server端可以收到client的数据,但是发数据给client, send就会一直block, 客户端也收不到, 代码如下:

memset(&serv, 0, sizeof(sockaddr_in));
serv.sin_family = AF_INET;
serv.sin_port = htons(8421);
serv.sin_addr.s_addr = htons(0);

server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ei = bind(server, (sockaddr*)&serv, sizeof(sockaddr_in));
ei = listen(server, 0);  //ei = listen(server, 5);
printf("Server socket start listening ... \r\n");

while (1)
{

client = accept(server, (sockaddr*)&cli, &len);

printf("new client =%d\r\n",client);     //   程序不停的打印信息, accept不停的返回,返回值为-57

//如果有客户端连接时,下面能正常接收客户端发来的数据,但是发送给客户端会一直block在send里面,客户端并没有收到数据。

rev_len=recv(client, data, 400, 0);
printf("received data:%s\r\n",data);      //收到正常数据

send_len = send(client,connect_reply,strlen(connect_reply),0);    // 一直block在这里

.......

}

怎么回事?

望相关人员能给与指导,谢谢。

你好,我这边也是情况差不多,也是移植到可以连接到路由器的状态,然后用网络助手调试,网络调试助手当做TCP server ,cc3000当做客户端,然后客户端在连接服务端的时候有时候会出现连不上的情况,有时能连上,有时不能连接上。

能否在accept那里先循环看看,-57代表TRY AGAIN。等有连接之后再去接收或发送。

或者你在接收或发送之前检查一下你的client socket是不是合法的。

server的socket并没有设置为non_block模式的, 为什么accept会返回TRY AGAIN?  在没有client连接的时候,不是应该一直block在那里么?

而且我查了返回值定义, #define ERROR_SOCKET_INACTIVE   -57   , 这是Cc3000_common.h定义的,不知道 TRY AGAIN 那里定义的。

而且我发现是accept后大概几十秒才返回-57的, 有点类似别人提到的建立的tcp socket如果没有数据传输几十秒idle就会自动断掉,不知道是不是类似的情况。

关于发送数据, 首先问题和上面的无关, 是server accept调用后,如果马上有client连接, accept是正常返回的,不是-57, 这时可以从该 client socket接收到数据,但是send时client收不到,这边就一直block在send函数。 能收到client数据, client socket应该是合法的, 该client程序是在windows平台写的测试程序, 也用过其他的网络测试工具实验过,同样的问题,所以client socket应该没问题的。

谢谢您的支持。

您好,我现在遇到个问题是想获得socket的连接状态  我查到可以使用getsockopt函数,但是固件库里定义的optionname只有

#define SOCKOPT_RECV_NONBLOCK 0 // recv non block mode, set SOCK_ON or SOCK_OFF (default block mode)
#define SOCKOPT_RECV_TIMEOUT 1 // optname to configure recv and recvfromtimeout
#define SOCKOPT_ACCEPT_NONBLOCK 2 // accept non block mode, set SOCK_ON or SOCK_OFF (default block mode)

只有这三个,其他像SO_ERROR就没有定义,我想知道它的定义

或者有什么方法检查连接已经断开了(CC3000为客户端,连接到PC,如果PC断开,我想知道已经断开了,或者CC3000能够给我返回什么通知)

上一篇:wiki 下载问题
下一篇:关于FTDI

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top