我在server.c中有以下代码
while (1) {
char msg[1024];
recv(fd, msg, 1024, 0);
}
从客户端,首先,我发送了#34; hello world"。
然后我收到了#34;你好世界"在服务器中。
然后我发送了" hexx"到服务器。
但我收到了" hexxo world"在服务器上。
似乎msg没有完全清除。
请让我知道我做错了什么。
干杯。
答案 0 :(得分:3)
您正在为消息分配1024个字节,并且永远不会将该数据归零。你只是一遍又一遍地读入同一个缓冲区。首先在第二遍中读取“hello world”,你将“hexx”放在相同的起始地址中,产生“hexxo world”
正如DoxyLover所提到的,你可以null终止新读取的字符串并获得你想要的东西。
答案 1 :(得分:1)
read()
不会终止缓冲区。因此,您将看到缓冲区中遗留的旧数据。
你想要的是:
while (1) {
char msg[1024];
ssize_t n = recv(fd, msg, 1023, 0);
if (n >= 0)
msg[n] = '\0';
}
请注意,我将读取限制为小于缓冲区大小的值,以便为空字节留出空间。显然,这只适用于文本数据。对于二进制数据,您需要记录read()
的返回值,并在处理缓冲区时将其用作字节计数。例如,要将数据从一个套接字复制到另一个套接字:
while (1) {
char msg[1024];
ssize_t n = recv(fd, msg, 1024, 0);
if (n > 0)
send(second_fd, msg, n, 0);
}
所有这些都非常简单 - 您需要进行错误检查,检查read()
的返回以确保收到任何字节,检查send()
的返回以确保所有字节都已发送等等。
答案 2 :(得分:0)
tcp recv不清除旧数据
谁说会呢?不是说它应该是必要的。您忽略recv().
返回的计数。在致电recv(),
后,有三种可能性:
perror()
。目前你没有正确地做这些事情。