【发布时间】:2023-12-04 20:35:02
【问题描述】:
我想实现一个带有阻塞读取的简单 TCP 服务器,它接收从客户端发送的消息一个字符一个字符,直到一个分隔符。一旦收到一条消息,它必须等到下一条消息出现。这是我的伪代码:
// Messages sent from the client
char *message1 = "mssg1\n"
char *message2 = "mssg2\n"
// On server side
char buffer;
char completeMessage[5]
while(1){
while(buffer != '\n'){
recv(sock, &buffer, 1, 0); // 1 is the read size
if(buffer != '\n') {
printf("buffer: %c\n", buffer);
completeMessage[n] = buffer;
count ++;
}
else{
printf("Complete message: %s\n", completeMessage);
count = 0;
}
}
}
结果如下:
buffer: m
buffer: s
buffer: s
buffer: g
buffer: 1
Complete message: mssg1
buffer:
buffer:
buffer:
buffer:
buffer:
buffer:
// Error due to buffer overflow
我不知道为什么 recv 不是等待下一个消息字符(阻塞读取),而是继续读取空格。我的问题如下:
- recv 真的是一个套接字阻塞读取函数吗?
- 代码中是否有错误或遗漏?
- 对于实现此功能还有其他建议吗?
【问题讨论】:
-
Re "recv 真的是一个套接字阻塞读取函数吗?",是的,除非你将句柄设为非阻塞。
-
Re "代码中是否有错误或遗漏?",您没有检查
read返回的内容。0表示 EOF,-1表示错误。另外,你不会检查你的缓冲区有多满 -
recv()返回一个值。你可以使用它。 -
在使用
%s打印之前,您不会向completeMessage添加空终止符。 -
您的客户端代码很可能会在换行符之后发送带有额外 NUL 字符的整个缓冲区,因此您正在阅读这些 NUL。但是由于你不显示客户端代码,所以无法分辨。