用tcp请求网页的实验,预期是接收到长度0时,就跳出循环。问题是打印接收到长度215后,就卡住了,等了1分钟才会打印收到长度0并跳出。为什么会等1分钟呢?
`
const char* msg = str.UTF8String;
ssize_t len = send(self.client, msg, strlen(msg), 0);
NSLog(@"发送了长度:%ld", len);
uint8_t buf[1024];
ssize_t count = 1;
do {
count = recv(self.client, buf, sizeof(buf), 0);
NSLog(@"收到长度:%zd", count);
} while (count != 0);
NSLog(@"skip");
`
打印:
`
2021-01-23 16:48:26.243796+0800 sock[1058:34645] 发送了长度:39
2021-01-23 16:48:26.262762+0800 sock[1058:34645] 收到长度:1024
2021-01-23 16:48:26.267321+0800 sock[1058:34645] 收到长度:1024
2021-01-23 16:48:26.278972+0800 sock[1058:34645] 收到长度:215
(这里等了很久,多次尝试都是差1分钟)
2021-01-23 16:49:26.255403+0800 sock[1058:34645] 收到长度:0
2021-01-23 16:49:26.256017+0800 sock[1058:34645] skip`
因为你的程序不完整,不知道你访问的对端是什么。我猜测应该是一个http应用,而这个http应用开启了http keep-alive,因此对方会在传送完所有数据之后依然保持开启,直到1分钟之后它才真正关闭底层的tcp连接,此时你的recv的返回值0表示对端已经关闭