C:printf non printing \ n

时间:2012-11-26 17:20:27

标签: c sockets newline printf

在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) 感谢。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

TCP没有“消息”,它处理两个方向上的连续字节流。你只是阅读到那个时刻和你的2000年之间收到的数据之间的任何东西。或许你真的想要Stream Control Transmission Protocol?或者以某种方式标记消息(可能是'\ n'),并逐个字符地读取?或者只是读取单个消息的长度(如果它们是固定长度,那么)?