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();
}
我是套接字编程的新手。我正在尝试创建一个客户端应用程序。服务器是使用 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();
}