gpt4 book ai didi

c - 使用 recv 接收传入的 char 数组

转载 作者:可可西里 更新时间:2023-11-01 02:41:51 24 4
gpt4 key购买 nike

关于 C 套接字的问题回来了。

我正在尝试通过 TCP 从客户端接收一个字符数组。我有以下 recv 代码:

char buffer[2048];
int recvBytes = 0;

while (1) {

if ((clntSockfd = accept(servSockfd, (struct sockaddr *) &clntAddr, &clntSockAddrLen)) == -1) {
printf("Unable to accept client connection\n");
exit(1);
}
else {
printf("Client connection accepted!\n");
}

/* clear buffer */
memset(buffer, 0, sizeof(buffer));

recvBytes = recv (clntSockfd, buffer, sizeof(buffer), 0);
printf("Bytes received: %i\n", recvBytes);
printf("Char array received: %s\n", buffer);
}

我注意到在执行时,recvBytes 在第一次迭代中显示为零。只有在第二次迭代之后,它才会获取传入的 char 数组。

我想知道 recv 是否会阻塞,直到我从传入套接字接收到数据?我应该如何丢弃缓冲区中不需要的字符 - 即丢弃从第一次迭代收到的字符。

非常感谢!

-- 编辑 ---

大家好,我已经附加了 eclipse 的控制台输出。

**... <- initialization stuff
Binding socket to port
Socket binded
Start listening on port 8081.
Client connection accepted! *while loop - first iteration
Bytes received: 0 *while loop - first iteration
Char array received: *while loop - first iteration
Client connection accepted! *while loop - second iteration
Bytes received: 22 *while loop - second iteration
Char array received: 1~Message~HowAreYou? *while loop - second iteration**

希望上面的控制台输出能更清楚地说明我关于第一次和第二次迭代的问题。从上面可以看出,第一次迭代没有接收到任何字节,但 recv 没有阻塞。我认为 recv 应该阻塞直到它接收到字节?

最佳答案

我相信 recv 只有在远程端关闭连接(对于流式套接字,例如 TCP)或者如果接收到没有有效负载的数据包(数据报套接字,例如 UDP)时才返回 0。

如果套接字已设置为非阻塞模式(默认为阻塞),并且还没有数据,您将得到一个错误代码,EAGAINEWOULDBLOCK 取决于操作系统。

在任何情况下,每次recv 返回时,新数据都会存储在缓冲区的开头。它不会附加到以前接收到的数据,除非您计算出一个指针,用于在旧数据之后存储新数据。

关于c - 使用 recv 接收传入的 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4559986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com