iOS BSD Socket

用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`
阅读 1.1k
1 个回答

因为你的程序不完整,不知道你访问的对端是什么。我猜测应该是一个http应用,而这个http应用开启了http keep-alive,因此对方会在传送完所有数据之后依然保持开启,直到1分钟之后它才真正关闭底层的tcp连接,此时你的recv的返回值0表示对端已经关闭

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题