timelikesong 2016-04-17 03:23 采纳率: 0%
浏览 2499
已结题

关于windows下socket编程的recv函数

Talk is cheap,show me the code.
do{

memset(buf, 0, BUFSIZ);

strLen = recv(reads.fd_array[i], buf, BUFSIZ - 1, 0);

                    if (strLen == 0 || strLen == -1){
                        FD_CLR(reads.fd_array[i], &reads);
                        closesocket(cpyReads.fd_array[i]);
                        printf("closed client:%d \n", cpyReads.fd_array[i]);
                    }
                    else{
                        printf("From %d : %s", cpyReads.fd_array[i], buf);
                        //send(reads.fd_array[i], buf, strLen, 0);
                    }

} while (strLen==BUFSIZ-1);

我设置的BUFSIZ 是10
我在调用recv函数来取客户端发过来的数据时,如果收到的数据长度大于我设置的缓冲大小也就是BUFSIZ 比如发过来的是10个字符 , 那么do while 循环会循环两次,如果我发送过来的正好是9个字符 , 为啥只循环了一次呢。我调试看到 strLen 明明等于BUFSIZ-1 的 , 于是在上面的memset处加的断点,才知道确实是循环了两次, 可是执行到 recv函数的时候 整个循环直接跳出来了,不太明白这里,求大神讲解一下,站等。。。

  • 写回答

1条回答 默认 最新

  • webcq 2016-04-17 11:51
    关注

    跳到do while语句之后执行吗?如果套接字不阻塞,应该在第二次recv时返回0吧,否则应该在recv时阻塞吧。还有一种可能,就是你这段代码是多线程调用的,在当前线程实际是阻塞到recv了,而转到另一个线程执行do while之后的代码。

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。