recv(int sockfd,void* buf,size_t len,int flags)
与read基本相同
异同点:
1、recv只能用于套接字
2、recv比read多了个flags选项
falgs:MSG_OOB 指定接收带外数据,通过紧急指针发送的数据,TCP头部有个紧急指针指定了带外数据
MSG_PEEK 接收缓冲区中数据,但是并不清除缓冲区的数据 跟read函数有区别的地方
下面是 一个实现按行读取的实现
ssize_t recv_peek(int sockfd,void* buf,size_t len)
{
while(1)
{
int ret = recv(sockfd,buf,len,MSG_PEEK);
if(ret == -1 && error == EINTER)
continue;
return ret;
}
}
ssize_t readline(int sockfd,void *buf,size_t maxline)
{
int ret;
int nread;
char *bufp = buf;
int nleft = maxline;
while(nleft > 0)
{
ret = recv_peek(sockfd,bufp,nleft);
if(ret < 0)
return ret;
else if(ret == 0)
return ret; //对方关闭
nread = ret;
if(nread > nleft)
{
return -1;
}
int i;
for(i=0;i<nread;i++)
{
if(bufp[i] == '\n')
{
ret = readn(sockfd,bufp,i+1);
if(ret != i+1)
{
return -1;
}
return ret;
}
}
nleft -= nread;
ret = readn(fd,bufp,nread);
if(ret != nread)
return -1;
bufp += nread;
}
return -1;
}getsockname 获取套接口本地的地址
getperrname 获取对等放的地址
gethostbyaddr 给定的地址结构 获取本机的所有地址
本文详细介绍了套接字recv函数及其与read函数的区别,并提供了使用MSG_PEEK标志实现按行读取数据的方法。此外还介绍了如何使用getsockname和getpeername函数获取本地和对端地址。
1709

被折叠的 条评论
为什么被折叠?



