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