使用recv接收传入的char数组

时间:2010-12-30 04:23:11

标签: c sockets tcp

回到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 个答案:

答案 0 :(得分:1)

如果您的套接字是阻塞套接字,则recv函数将阻塞,直到您获得一些数据。只有当另一侧在大多数系统上关闭连接时,recv函数才会返回0。

我建议你重新检查你的代码和执行情况,并告诉我们确切的输出。

有关详细信息,请参阅herehere

答案 1 :(得分:1)

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

如果套接字已设置为非阻塞模式(默认为阻止),并且没有数据尚未,则会收到错误代码EAGAIN或{{ 1}}取决于操作系统。

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

答案 2 :(得分:0)

如果您知道对所收到数据的期望,可以删除第一组字符。例如,如果您知道数据包的长度是什么,或者消息的来源或标题信息,那么您可以验证并忽略第一组字符。