TCP 套接字 FIONREAD 仅在每次 recv 调用时递增 linux
TCP Socket FIONREAD only increments on every recv call linux
我有一个服务器客户端设置,当服务器 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() 调用 运行s ioctl(fd, FIONREAD, &size) 以获取可用于从套接字读取的字节数。每当回调为 运行 时,bytesAvailable() 只是继续递增 5,有效负载中数据的值只是垃圾。 read 在 fd 上调用 运行s 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:
我是套接字新手,如有任何帮助,我们将不胜感激!
忘记将此标记为已解决。所有套接字实例都从套接字基 class 继承它们的文件描述符变量。 TCPSocket class 有一个重载的 fd var 被设置而不是基本 fd。
我有一个服务器客户端设置,当服务器 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() 调用 运行s ioctl(fd, FIONREAD, &size) 以获取可用于从套接字读取的字节数。每当回调为 运行 时,bytesAvailable() 只是继续递增 5,有效负载中数据的值只是垃圾。 read 在 fd 上调用 运行s 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:
我是套接字新手,如有任何帮助,我们将不胜感激!
忘记将此标记为已解决。所有套接字实例都从套接字基 class 继承它们的文件描述符变量。 TCPSocket class 有一个重载的 fd var 被设置而不是基本 fd。