linux - TCP Socket FIONREAD仅在每次recv调用linux时递增

标签 linux tcpsocket

我有一个服务器客户端设置,当服务器 fd 有数据要读取时,会运行回调来格式化和传播数据。服务器和客户端共享相同的 header ,定义有效负载,如下所示:

#ifndef DATA_HEADER_
#define DATA_HEADER_

#pragma pack(1)

typedef struct {
  int command;
  uint8_t val;
} cmd_t;

#pragma pack()

#endif

执行读取操作的回调函数如下:

int Server::onBytesAvailable(Socket *s)
{
  //get bytes available and set up data array
  int len = s->bytesAvailable();
  char *msg = new char[len];
  s->read(msg, len);

  //cast as command struct
  cmd_t *cmd = (cmd_t *) msg;

  //print values
  std::cout << "LEN: " << len << std::endl;
  std::cout << "MSG LEN " << sizeof(msg) << std::endl;
  std::cout << "CMD: " << cmd->cmdid << std::endl;
  std::cout << "VAL: " << cmd->togglePwr << std::endl;

  propigateData(cmd);
  return 0;
}

bytesAvailable() 调用运行 ioctl(fd, FIONREAD, &size) 以获取可从套接字读取的字节。每当回调运行时,bytesAvailable() 都会继续增加 5,而有效负载中的数据值只是垃圾。 read 调用在 fd 上运行 recv 并将数据放入 msg 数组中。

打印输出如下所示:

output:

LEN: 5
MSG LEN 4
CMD: 0
VAL: ▒
LEN: 10
MSG LEN 4
CMD: 0
VAL: ▒
LEN: 15
MSG LEN 4
CMD: 0
VAL:
LEN: 20
MSG LEN 4
CMD: 0
VAL:

我是套接字新手,因此我们将不胜感激!

最佳答案

忘记将此标记为已解决。所有套接字实例都从套接字基类继承其文件描述符变量。 TCPSocket 类有一个重载的 fd var,它被设置而不是基 fd。

关于linux - TCP Socket FIONREAD仅在每次recv调用linux时递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31255656/

相关文章:

linux - 如何检查文件夹是否为空或文件夹文件是否使用 shell 脚本?

c - Linux 中的 itoa 函数在哪里?

linux - Windows 生产服务器上的 Drupal 7 和 WordPress 3.8?

qt - 客户端套接字发送但静默服务器套接字不接收

tcp - 在 EC2 实例上扩展 TCP 服务器的分布式问题

c - 为什么一个简单的 C 程序链接到 libc.a,而不是 libc.so?

linux - bash:有意义的唯一 ID 生成

ios - 即使 enableBackgroundingOnSocket 设置为 TRUE,XMPPFramework 也不会发送在后台保持事件状态

c - 在套接字上发送时出错错误文件描述符