网络开发-3-recv函数 发表于 2017-06-11 | 分类于 网络开发 | recv 和read功能类似,只能读取socket内容 可以指定接收的行为 主要有用的读取的类型有两种: (1) 指定接收带外数据,也就是紧急指针 (2) 可以接受缓冲区的数据,但是并不将数据从缓冲区清除; 封装一个recv_peek函数: 12345678910ssize_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函数: 1234567891011121314151617181920212223242526272829303132333435363738394041ssize_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;}