recv()直到收到NUL字节?
我试图从服务器一次接收一个数据包,因为数据包速度太快,每个都是未定义的大小,调用recv()读取的字节数将读取第一个数据包,也许是一部分第二个包。由于每个数据包都是NULL终止的,我以为逐字节读取,直到收到一个NULL字节。
int recvLen = 0;
char TB;
char recvBuffer[1024];
while (recv(Socket, &TB, 1, 0) > 0 && TB != 0 && recvLen < 1024)
{
recvBuffer[recvLen] = TB;
recvLen++;
}
我认为这种方法根本不高效。如果服务器发送1024字节,则recv()
将被调用1024次。
是否有任何其他方法recv()直到收到NULL char,或者一些比我正在使用的更好的方法?
编辑:
我添加了从服务器发送的数据的数据包大小,但现在,如果是错误的数据包,甚至有时无理由,数据包会搞砸,并且没有收到正确的数据。这是我的代码
#define UPLOAD_LEN 2755
int PacketSize, recvLen;
char Size[4];
char recvBuffer[UPLOAD_LEN+1];
while(1)
{
if(recv(Socket,Size,4,0)>0)
{
Size[4] = ' ';
PacketSize = atoi(Size);
if (PacketSize > UPLOAD_LEN || PacketSize <= 0) continue;
recvLen = recv(Socket, recvBuffer, PacketSize, 0);
} else recvLen = -1;
if (recvLen > 0)
{
recvBuffer[recvLen] = ' ';
ProcessData(recvBuffer);
}
else
{
closesocket(Socket);
}
}
没有找到相关结果
已邀请:
3 个回复
博沮富教全
像这样使用它:
关键是TCP / IP没有消息边界的概念,因此recv()可以返回1到请求的字节数。收到的缓冲区可能包含多个甚至部分消息。 此代码只是将接收到的数据附加到缓冲区中。协议从缓冲区请求字节,缓冲区从套接字填充。当字节被移除时,剩余的缓冲数据被移位到缓冲区的开头。 在这种情况下,请求两个字节,转换为长度,然后请求剩余的字节。如果无法满足请求,则会收集更多数据。 希望这可以帮助。
扑北爱
惜堡沁戚