基于tcp的阻塞socket规范读操作
引用:int read_data(int sock_fd, char *buffer, int buffer_len)
{
char *ptemp = buffer;
int bytes_to_recv = buffer_len;
int bytes_recv = 0;
if (sock_fd < 0 || NULL == buffer || buffer_len <= 0)
{
return -1;
}
while (bytes_to_recv > 0)
{
bytes_recv = recv(sock_fd, ptemp, bytes_to_recv, 0);
if (0 == bytes_recv)
{
// the server has close the connection gracefully.
close(fd);
return -1;
}
else if (bytes_recv < 0)
{
if ((EINTR == errno) || (EAGAIN == errno))
{
continue;
}
else
{
close(fd);
return -1;
}
}
else
{
ptemp += bytes_recv;
bytes_to_recv -= bytes_recv;
}
}
return 0;
}
有三个问题需要注意:
1. read_data不要与系统函数重名,初学者容易犯这种错;
2. 要用while循环收数据,尤其是将recv换成recvfrom时;
3. 注意ptemp要加偏移,否则数据是错的。
小豆儿 于 2011-07-19 10:20:12发表:
是socket 阻塞读返回信息吗?