包裹函数,处理出错
命名要求,大写前面一个字母,如write的包裹函数要Write。
write包裹函数
ssize_t Write (int fd, const void *buf, size_t num)
{
ssize_t res;
size_t n;
const char *ptr;
n = num;
ptr = buf;
while (n > 0) {
if ((res = write (fd, ptr, n)) <= 0) {
if (errno == EINTR)
res = 0;
else
return (-1);
}
ptr += res;
n -= res;
}
return (num);
}
read包裹函数
//————————————————————————————————————————————————————————
//read包裹函数
ssize_t Read (int fd, void *buf, size_t num)
{
ssize_t res;
size_t n;
char *ptr;
n = num;
ptr = buf;
while (n > 0) {
if ((res = read (fd, ptr, n)) == -1) {
if (errno == EINTR)
res = 0;
else
return (-1);
}
else if (res == 0)
break;
ptr += res;
n -= res;
}
return (num - n);
}
int Bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
return bind(sockfd, addr, addrlen);
}
int Listen(int sockfd, int backlog)
{
return listen(sockfd, backlog);
}
Accept包裹函数
int Accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
int connfd = accept(sockfd, addr, addrlen);
if(connfd == -1)
{
perror("accept() failed");
exit(0);
}
return connfd;
}
connect包裹函数
#define MAXSLEEP 128
int Connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen)
{
int nsec;
for(nsec = 1;nsec <= MAXSLEEP;nsec <<= 1)
{
if(connect(sockfd,servaddr,addrlen) == 0)
return 0;
if(nsec <= MAXSLEEP/2)
sleep(nsec);
}
return -1;
}
Socket包裹函数
int Socket(int domain, int type, int protocol)
{
int sockfd = socket(domain, type, protocol);
if(sockfd == -1)
{
perror("socket() error");
}
return sockfd;
}
Setsockopt包裹函数
int Setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen)
{
int retval = setsockopt(sockfd, level, optname, optval, optlen);
if(retval == -1)
{
perror("setsockopt() error");
}
return retval;
}
select包裹函数
int Select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout)
{
int n = select(nfds, readfds, writefds, exceptfds, timeout);
if ( n < 0 )
error_quit("select error");
return n; /* can return 0 on timeout */
}
Linux下Socket编程—-connect()函数的包裹函数介绍
1.4 错误处理:包裹函数