recv()函数在循环时如何工作?

问题描述 投票:0回答:2

我在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 sockets client-server server recv
2个回答
8
投票

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.
}

2
投票

您错过了主要细节 - 使用哪种套接字以及请求什么协议。对于 TCP,数据是八位字节粒度的,是的,如果发送了 256 个字节,而您只读取了 5 个字节,则其余 251 个字节将在套接字缓冲区中等待(假设缓冲区更大,这对于任何非嵌入式系统都是如此),并且您可以在下一个recv() 中获取它们。使用 UDP 且不使用 MSG_PEEK,单个数据报的其余部分将丢失,但是,如果指定了 MSG_PEEK,则下一个 recv() 将从头开始给出数据报。使用 SCTP 或另一个“顺序数据包”协议,AFAIK,可以得到与 UDP 相同的行为,但我不确定 Windows 实现细节。

© www.soinside.com 2019 - 2024. All rights reserved.