【发布时间】:2018-12-18 01:04:29
【问题描述】:
我是套接字编程的新手。我正在尝试创建一个客户端应用程序。服务器是使用 TCP 通信的摄像机。相机正在发送连续数据。使用 Wireshark,我可以看到相机正在发送不同大小的连续数据包,但不超过 1514 字节。但是我的recv 函数总是返回2000,这是我缓冲区的大小。
unsigned char buf[2000];
int bytesIn = recv(sock, (char*)buf, sizeof(buf) , 0);
if (bytesIn > 0)
{
std::cout << bytesIn << std::endl;
}
我收到的第一个数据包大小为 9 字节,recv 返回正确,但之后总是返回 2000。
谁能告诉我解决方案,以便我可以得到实际数据负载的正确大小?
编辑
int bytesIn = recv(sock, (char*)buf, sizeof(buf) , 0);
if (bytesIn > 0)
{
while (bytes != 1514)
{
if (count == 221184)
{
break;
}
buffer[count++] = buf[bytes++];
}
std::cout << count;
}
编辑:
这是我的 Wireshark 捕获:
处理数据包的代码
int bytesIn = recv(sock, (char*)&buf, sizeof(buf) , 0);
if (bytesIn > 0)
{
if (flag1 == true)
{
while ((bytes != 1460 && (buf[bytes] != 0)) && _fillFlag)
{
buffer[fill++] = buf[bytes++];
if (fill == 221184)
{
flag1 = false;
_fillFlag = false;
fill = 0;
queue.Enqueue(buffer, sizeof(buffer));
break;
}
}
}
if ((strncmp(buf, _string2, 10) == 0))
{
flag1 = true;
}
}
对于每帧相机发送 221184 字节,在每帧之后它发送一个数据包 9 个字节,我用来比较这 9 个字节是恒定的。
相机发送的这个 221184 字节没有 0,所以我在 while 循环中使用这个条件。此代码正在工作并显示框架,但在几帧之后它显示全黑框架。我认为错误在于接收数据包。
【问题讨论】:
-
TCP/IP 是流而不是数据包协议。在网络上,您会看到数据包,但在 API 级别,接收到的数据是连续的字节流。您需要解析这些字节以将接收到的数据分离和/或加入到相机帧中。
-
我正在将该数据放入缓冲区
-
如果相机连续发送数据没有任何具体区别,客户端不加区别地接收缓冲区。主要原因是
recv函数只执行读取PC中设置的缓冲区的简单功能。 -
@Lakshraj 您能否发布更多关于您的实施的信息。
221184是什么?是Maximum of Data还是Size of per frame? -
您必须实际实现相机正在使用的消息协议。 TCP 不是消息协议。
标签: c++ sockets tcp packet recv