日期:2014-05-16  浏览次数:20701 次

socket阻塞的问题
各位大虾,小弟在调试8688的wifi过程当中发现,连接ap时发送psk密码的命令会延时很长时间。然后一路跟踪,发现在wpa_supplicant的代码中有这么一段:

if (send(ctrl->s, _cmd, _cmd_len, 0) < 0) {
os_free(cmd_buf);
return -1;
}
os_free(cmd_buf);

for (;;) {
#ifdef ANDROID
tv.tv_sec = 10;
#else
tv.tv_sec = 2;
#endif
tv.tv_usec = 0;
FD_ZERO(&rfds);
FD_SET(ctrl->s, &rfds);
res = select(ctrl->s + 1, &rfds, NULL, NULL, &tv);//阻塞发生在这里[color=#FF0000][/color] if (FD_ISSET(ctrl->s, &rfds)) {
res = recv(ctrl->s, reply, *reply_len, 0);

我想请问大侠们,这个阻塞的原因是什么呀?如何继续跟踪问题呢?谢谢!!

------解决方案--------------------
这里的select是判断是否有数据可读,没有数据时会阻塞
至于为什么没有数据,就不知道了
------解决方案--------------------
人家不理你,你收不到数据呗,
------解决方案--------------------
那你查一下,为什么没有给你的socket发送数据啊!
------解决方案--------------------
1. 别人不理你
2. 是不是Android这个宏起作用了,把时间搞的短点
#ifdef ANDROID
tv.tv_sec = 10;
#else
tv.tv_sec = 2;

------解决方案--------------------
select模型是异步的,理论上不会出现这种问题。
------解决方案--------------------
res = select(ctrl->s + 1, &rfds, NULL, NULL, &tv);
你这里使用了tv,指示当没有文件描述符可用时要等待tv指定的时间,即
tv.tv_sec, 你可以 tv.tv_sec = 0;
这样不管文件描述符是否有变化,都立刻返回
------解决方案--------------------
按照你的代码,android 下面, select 如果没有读文件就需,就需要等待 10s
------解决方案--------------------
这里select应该没有问题得啊 关键socket 的另一方相应的时间,你用其他设备测试过没有呢?