cc3000 socket api, accept, send问题
我在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能够给我返回什么通知)