首页 文章

使用recv接收传入的char数组

提问于
浏览
2

我回来了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 回答

  • 1

    如果你的套接字是一个阻塞套接字,那么recv函数将阻塞,直到你得到一些数据 . 只有当另一端在大多数系统上关闭连接时,recv函数才会返回0 .

    我建议你重新检查你的代码和执行,让我们知道确切的输出 .

    有关详细信息,请参阅herehere .

  • 0

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

  • 1

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

    如果套接字已设置为非阻塞模式(默认为阻塞),并且还没有数据,则会收到错误代码 EAGAINEWOULDBLOCK ,具体取决于操作系统 .

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

相关问题