在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) 感谢。
答案 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'),并逐个字符地读取?或者只是读取单个消息的长度(如果它们是固定长度,那么)?