关键词搜索

源码搜索 ×
×

tcp socket 的 recv 如何接收指定长度消息?

发布2022-07-03浏览1067次

详情内容

有时候,tcp socket一定要接收到指定的字节数才算符合预期,那怎么实现呢?

在很多网络编程的书中都有介绍,一起来看看(一直循环接受,达标为止):

  1. int recvLength(char *sRecvBuffer, size_t iRecvLen)
  2. {
  3. int iRet = checkSocket();
  4. if(iRet < 0)
  5. {
  6. return iRet;
  7. }
  8. size_t iRecvLeft = iRecvLen;
  9. iRecvLen = 0;
  10. TC_Epoller epoller(false);
  11. epoller.create(1);
  12. epoller.add(_socket.getfd(), 0, EPOLLIN);
  13. while(iRecvLeft != 0)
  14. {
  15. int iRetCode = epoller.wait(_timeout);
  16. if (iRetCode < 0)
  17. {
  18. _socket.close();
  19. return EM_SELECT;
  20. }
  21. else if (iRetCode == 0)
  22. {
  23. _socket.close();
  24. return EM_TIMEOUT;
  25. }
  26. epoll_event ev = epoller.get(0);
  27. if(ev.events & EPOLLIN)
  28. {
  29. int len = _socket.recv((void*)(sRecvBuffer + iRecvLen), iRecvLeft);
  30. if (len < 0)
  31. {
  32. _socket.close();
  33. return EM_RECV;
  34. }
  35. else if (len == 0)
  36. {
  37. _socket.close();
  38. return EM_CLOSE;
  39. }
  40. iRecvLeft -= len;
  41. iRecvLen += len;
  42. }
  43. else
  44. {
  45. _socket.close();
  46. return EM_SELECT;
  47. }
  48. }
  49. return EM_SUCCESS;
  50. }

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载