回到C套接字问题。
我试图通过TCP从客户端接收一个char数组。我有以下 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应该阻塞直到收到字节?
答案 0 :(得分:1)
如果您的套接字是阻塞套接字,则recv函数将阻塞,直到您获得一些数据。只有当另一侧在大多数系统上关闭连接时,recv函数才会返回0。
我建议你重新检查你的代码和执行情况,并告诉我们确切的输出。
答案 1 :(得分:1)
我相信如果远程端关闭连接(对于TCP等流套接字),或者如果收到没有有效负载的数据包(UDP等数据报套接字),则recv
仅返回0。
如果套接字已设置为非阻塞模式(默认为阻止),并且没有数据尚未,则会收到错误代码EAGAIN
或{{ 1}}取决于操作系统。
在任何情况下,每次EWOULDBLOCK
返回时,新数据都将存储在缓冲区的开头。除非您计算用于存储旧数据之后的新数据的指针,否则它不会附加到先前接收的数据。
答案 2 :(得分:0)
如果您知道对所收到数据的期望,可以删除第一组字符。例如,如果您知道数据包的长度是什么,或者消息的来源或标题信息,那么您可以验证并忽略第一组字符。