TCP Socket编程的recv函数

Recv function for TCP Socket programming

我是套接字编程的新手。我正在尝试创建一个客户端应用程序。服务器是使用 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 returns 正确,但之后总是 returns 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循环中使用这个条件。此代码正在运行并显示框架,但在几帧之后显示全黑框架。我认为错误在于接收数据包。

The first packet I receive is of size 9 bytes which it print correct after that it always print 2000. So can anyone please tell me the solution that I only get the size of actual data payload.

TCP不是面向包的,而是面向流的传输协议。 TCP 中没有数据包的概念(除了 MTU 之外)。如果你想在数据包中工作,你必须使用 UDP(它实际上是面向数据包的,但默认情况下在顺序、丢弃等方面不可靠)或者你必须在 TCP 中实现你的数据包逻辑,即从收到数据后,将数据流式传输并划分为逻辑数据包。

Size of per frame is : 221184 (fixed)   
Size of per recv is : 0 ~ 1514

我在这里的实现:

DWORD MakeFrame(int socket)
{
    INT nFrameSize = 221184;
    INT nSizeToRecv = 221184;
    INT nRecvSize = 2000;
    INT nReceived = 0;
    INT nTotalReceived = 0;
    BYTE byCamera[2000] = { 0 };    // byCamera size = nRecvSize
    BYTE byFrame[221184] = { 0 };   // byFrame size = nFrameSize

    while(0 != nSizeToRecv)
    {
        nRecvSize = min(2000, nSizeToRecv);
        nReceived = recv(socket, (char*)byCamera, nRecvSize, 0);

        memcpy_s(byFrame + nTotalReceived, nFrameSize, byCamera, nReceived);

        nSizeToRecv -= nReceived;
        nTotalReceived += nReceived;
    }

    // byFrame is ready to use.
    // ...
    // ...

    return WSAGetLastError();
}