1

在 C 中,我要求服务器打印它收到的任何消息的内容。所有消息都遵循以下格式:“消息:/counter/”。

while (1){
            length = sizeof(struct sockaddr);
    /*      receive from client */
            lenstr = recv(newfd, buff, 20000, 0);
            if (lenstr == -1){
                perror("recv(): ");
                exit(1);
            }
            buff[lenstr] = '\0';
            printf("Received: %s \n", buff);
    /*        send back to client*/
            if (send(newfd, buff, lenstr, 0) < 0){
                perror("send(): ");
                exit(-1);
            }

当我运行服务器时,消息一个接一个地出现,而不是换行。我在这里想念什么?(这里是 TCP 连接)谢谢。

4

2 回答 2

2

它从套接字接收的数据可能包含零或控制字符。这些不应打印。

尝试使用以下函数将接收到的数据转储到stdout. 它用一个点替换所有不可打印的字符:

void dump_buf(char const* buf, size_t buf_len) {
    char const* buf_end = buf + buf_len;
    while(buf != buf_end) {
        char c = *buf++;
        putchar(isprint(c) ? c : '.');
    }
    putchar('\n');
}

// ...

lenstr = recv(newfd, buff, 20000, 0);
if (lenstr == -1) {
    perror("recv(): ");
    exit(1);
}
dump_buf(buff, lenstr);
于 2013-02-08T18:47:37.497 回答
0

TCP 没有“消息”,它在两个方向上处理连续的字节流。您只是在读取截至该瞬间接收到的数据与您的 2000 之间的任何内容。也许您真的想要流控制传输协议?或者以某种方式标记消息结束(可能通过'\n'),并逐个字符地读取?或者只是读取单个消息的长度(如果它们是固定长度的,那就是)?

于 2013-02-08T18:34:25.587 回答