最近学习了Linux下面的tcp编程,Linux系统下提供了基本的socket函数,但是缺少了一些错误处理机制。下面是自己总结的一些接口程序,希望大家一起完善。
        /*wrap.h文件*/
/************************************************ 
*    The package about the tcp communication 
*    in Linux OS, including the error handling. 
*************************************************/ 

#ifndef WRAP_H 
#define WRAP_H 

#include <stdlib.h> 
#include <errno.h> 
#include <sys/socket.h> 

void perr_exit(const char *s); 

int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr); 
void Bind(int fd, const struct sockaddr *sa, socklen_t salen); 
void Connect(int fd, const struct sockaddr *sa, socklen_t salen); 
void Listen(int fd, int backlog); 

int Socket(int family, int type, int protocol); 
void Close(int fd); 

ssize_t Read(int fd, void *ptr, size_t nbytes); 
ssize_t Write(int fd, const void *ptr, size_t nbytes); 

ssize_t Readn(int fd, void *vptr, size_t n); 
ssize_t Writen(int fd, const void *vptr, size_t n); 

#endif 
 
         /*wrap.c文件*/
#include "wrap.h" 

/********************************************************************* 
* Name      : perr_exit 
* Description    : exit the function 
* Input    : the error string        
* Output    :    
* Return    :    
* Others    : by jzk 2009.12.02 
**********************************************************************/ 
void perr_exit(const char *s) 

     perror(s); 
     exit(1); 


/********************************************************************* 
* Name      : Accept 
* Description    : accept a connection on a socket 
* Input    : fd---a socket that has been created     
*                                                sa---a pointer to a sockaddr structure 
*                                                salenptr---actual size of the peer address 
* Output    :    
* Return    : the descriptor for the accepted socket    
* Others    : by jzk 2009.12.02 
**********************************************************************/ 
int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr) 

     int n; 

again: 
     if((n = accept(fd, sa, salenptr)) < 0) { 
            if((ECONNABORTED == errno) || (EINTR == errno)) 
                 goto again; 
            else 
                 perr_exit("accept error"); 
     } 
     
     return n; 


/********************************************************************* 
* Name      : Bind 
* Description    : bind a name to a socket 
* Input    : fd---a socket that has been created     
*                                                sa---a pointer to a sockaddr structure 
*                                                salen---the size of the address structure 
* Output    :    
* Return    :    
* Others    : by jzk 2009.12.02 
**********************************************************************/ 
void Bind(int fd, const struct sockaddr *sa, socklen_t salen) 

     if(bind(fd, sa, salen) < 0) 
            perr_exit("bind error"); 


/********************************************************************* 
* Name      : Connect 
* Description    : initiate a connection on a socket 
* Input    : fd---a socket that has been created     
*                                                sa---a pointer to a sockaddr structure 
*                                                salen---the size of the address structure 
* Output    :    
* Return    :    
* Others    : by jzk 2009.12.02 
**********************************************************************/ 
void Connect(int fd, const struct sockaddr *sa, socklen_t salen) 

     if(connect(fd, sa, salen) < 0) 
            perr_exit("connect error"); 


/********************************************************************* 
* Name      : Listen 
* Description    : listen for connections on a socket 
* Input    : fd---a socket that has been created     
*                                                backlog---the maximum length to the queue of 
*                                                                    pending connections 
* Output    :    
* Return    :    
* Others    : by jzk 2009.12.02 
**********************************************************************/ 
void Listen(int fd, int backlog) 

     if(listen(fd, backlog) < 0) 
            perr_exit("listen error"); 


/********************************************************************* 
* Name      : Socket 
* Description    : create an endpoint for communication 
* Input    : family---a communication domain     
*                                                type---the communication semantics 
*                                                protocol---a particular protocol for the socket 
* Output    :    
* Return    : return a descriptor of the socket 
* Others    : by jzk 2009.12.02 
**********************************************************************/ 
int Socket(int family, int type, int protocol) 

     int n; 

     if((n = socket(family, type, protocol)) < 0) 
             perr_exit("socket error"); 
     return n; 


/********************************************************************* 
* Name      : Read 
* Description    : read from a file descriptor 
* Input    : fd---a socket that has been created     
*                                                ptr---the buffer which storage the bytes    
*                                                nbytes---the number of bytes read 
* Output    :    
* Return    : return the number of bytes read 
* Others    : by jzk 2009.12.02 
**********************************************************************/ 
ssize_t Read(int fd, void *ptr, size_t nbytes) 

     ssize_t n; 

again: 
     if((n = read(fd, ptr, nbytes)) == -1) { 
            if(EINTR == errno) 
                 goto again; 
            else 
                 return -1; 
     }    
     
     return n; 


/********************************************************************* 
* Name      : Write 
* Description    : write to a file descriptor 
* Input    : fd---a socket that has been created     
*                                                ptr---buffer of the bytes    
*                                                nbytes---the number of bytes written 
* Output    :    
* Return    : return the number of bytes written 
* Others    : by jzk 2009.12.02 
**********************************************************************/ 
ssize_t Write(int fd, const void *ptr, size_t nbytes) 

     ssize_t n; 

again: 
     if((n = write(fd, ptr, nbytes)) == -1) { 
            if(EINTR == errno) 
                 goto again; 
            else 
                 return -1; 
     } 

     return n; 


/********************************************************************* 
* Name      : Close 
* Description    : close a file descriptor 
* Input    : fd---a socket that has been created     
* Output    :    
* Return    :    
* Others    : by jzk 2009.12.02 
**********************************************************************/ 
void Close(int fd) 

     if(close(fd) == -1) 
            perr_exit("close error");    


/********************************************************************* 
* Name      : Readn 
* Description    : read from a file descriptor,    
*                                                         make sure read the enough bytes 
* Input    : fd---a socket that has been created     
*                                                ptr---the buffer which storage the bytes    
*                                                nbytes---the number of bytes read 
* Output    :    
* Return    : return the number of bytes read 
* Others    : by jzk 2009.12.02 
**********************************************************************/ 
ssize_t Readn(int fd, void *vptr, size_t nbytes) 

     size_t nleft; 
     size_t nread; 
     char *ptr; 

     ptr = vptr; 
     nleft = nbytes; 

     while(nleft > 0) { 
            if((nread = read(fd, ptr, nleft)) < 0) { 
                 if(EINTR == errno)     
                        nread = 0; 
                 else 
                        return -1; 
            } else if(nread == 0) 
                    break; 

            nleft -= nread; 
            ptr += nread; 
     } 

     return (nbytes-nleft); 


/********************************************************************* 
* Name      : Writen 
* Description    : write to a file descriptor,    
*                                                         make sure write the enough bytes 
* Input    : fd---a socket that has been created     
*                                                ptr---the buffer which storage the bytes    
*                                                nbytes---the number of bytes read 
* Output    :    
* Return    : return the number of bytes read 
* Others    : by jzk 2009.12.02 
**********************************************************************/ 
ssize_t Writen(int fd, const void *vptr, size_t nbytes) 

     size_t nleft; 
     size_t nwritten; 
     const char *ptr; 

     ptr = vptr; 
     nleft = nbytes; 

     while(nleft > 0) { 
            if((nwritten = write(fd, ptr, nleft)) <= 0) {    
                 if(nwritten < 0 && EINTR == errno) 
                        nwritten = 0; 
                 else 
                        return -1; 
            } 
                
            nleft -= nwritten; 
            ptr += nwritten; 
     } 

     return nbytes; 
}