Jamal的博客

网络开发-3-recv函数

recv

  1. 和read功能类似,只能读取socket内容
  2. 可以指定接收的行为
  3. 主要有用的读取的类型有两种: (1) 指定接收带外数据,也就是紧急指针 (2) 可以接受缓冲区的数据,但是并不将数据从缓冲区清除; 封装一个recv_peek函数:
1
2
3
4
5
6
7
8
9
10
ssize_t recv_peek(int fd, void *buf, size_t len) {
while (1) {
int ret = recv(fd, buf, len, MSG_PEEK);
if(ret == -1 && errno == EINTR) {
// 信号中断,continue
continue;
}
return ret;
}
}

封装一个readline函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
ssize_t readline(int fd, void *buf, size_t maxline) {
int ret;
int nread;
char *bufp = buf;
int nleft = maxline;
while (1) {
ret = recv_peek(fd, bufp, nleft);
if (ret < 0) {
return ret;
} else if (ret == 0) {
// 对方关闭套接口
return ret;
}
nread = ret;
int i;
for (i = 0; i < nread; i++) {
if (bufp[i] == '\n') {
ret = readn(fd, bufp, i + 1);
if (ret != i + 1) {
exit(EXIT_FAILURE);
}
return ret;
}
}
if (nread > nleft) {
exit(EXIT_FAILURE);
}
nleft -= nread;
ret = readn(fd, bufp, nread);
if (ret != nread) {
exit(EXIT_FAILURE);
}
bufp += nread;
}
return -1;
}