This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我在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在这里
.......
}
怎么回事?
望相关人员能给与指导,谢谢。
能否在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能够给我返回什么通知)