我在MSDN上读到了有关send()和recv()函数的内容,有一点我不确定我是否理解。
如果我发送一个大小为256的缓冲区,并接收前5个字节,那么下次我调用recv()函数时,它将指向第6个字节并从那里获取数据?
例如:
char buff[256];
memcpy(buff,"hello world",12);
send(sockfd, buffer, 100) //sending 100 bytes
//server side:
char buff[256];
recv(sockfd, buff, 5) // now buffer contains : "Hello"?
recv(socfd, buff,5) // now I ovveride the data and the buffer contains "World"?
谢谢!
C中从TCP循环接收到缓冲区的正确方法如下:
char buffer[8192]; // or whatever you like, but best to keep it large
int count = 0;
int total = 0; // total bytes received
while ((count = recv(socket, &buffer[total], sizeof (buffer) - total, 0)) > 0)
{
total += count;
// At this point the buffer is valid from 0..total-1, if that's enough then process it and break, otherwise continue
}
if (count == -1)
{
perror("recv");
}
else if (count == 0)
{
// EOS on the socket: close it, exit the thread, etc.
}
您错过了主要细节 - 使用哪种套接字以及请求什么协议。对于 TCP,数据是八位字节粒度的,是的,如果发送了 256 个字节,而您只读取了 5 个字节,则其余 251 个字节将在套接字缓冲区中等待(假设缓冲区更大,这对于任何非嵌入式系统都是如此),并且您可以在下一个recv() 中获取它们。使用 UDP 且不使用 MSG_PEEK,单个数据报的其余部分将丢失,但是,如果指定了 MSG_PEEK,则下一个 recv() 将从头开始给出数据报。使用 SCTP 或另一个“顺序数据包”协议,AFAIK,可以得到与 UDP 相同的行为,但我不确定 Windows 实现细节。