下列函数用于linux socket编程

#include "qsock.h"
int set2nonblock(int fd)
{
 int flags;
 if((flags=fcntl(fd,f_getfl,0))<0)
 { fprintf(stderr,"fcntl f_getfl error\");
  exit(1);
 };
 flags|=o_nonblock;
 if(fcntl(fd,f_setfl,flags)<0)
 {
  fprintf(stderr,"fcntl f_setfl error\");
  exit(1);
 }
 return(1);
};
int set2block(int fd)
{
 int flags;
 if((flags=fcntl(fd,f_getfl,0))<0)
 { fprintf(stderr,"fcntl f_getfl error\");
  exit(1);
 };
 flags&=~o_nonblock;
 if(fcntl(fd,f_setfl,flags)<0)
 {
  fprintf(stderr,"fcntl f_setfl error\");
  exit(1);
 }
 return(1);
};

int opensocket_servertcp(int port)
{
 int fd;
 struct sockaddr_in addr;
 fd=socket(af_inet,sock_stream,0);
 if(fd<0)
 {
  fprintf(stderr,"socket error\");
  exit(1);
 }
 bzero(&addr,sizeof(addr));
 addr.sin_family=af_inet;
 addr.sin_addr.s_addr=htonl(inaddr_any);
 addr.sin_port=htons(port);
 printf("server tcp port=%d\",port);
 if(bind(fd,(struct sockaddr *)&addr,sizeof(addr))<0)
 {
  fprintf(stderr,"bind error\");
  exit(1);
 }
 if(listen(fd,1)<0)
 {
  perror("listen");
  exit(1);
 };
 set2nonblock(fd);
 return(fd);
};


int opensocket_serverudp(int port)
{
 int flags;
 int fd;
 struct sockaddr_in addr;
 fd=socket(af_inet,sock_dgram,0);
 if(fd<0)
 {
  fprintf(stderr,"socket error\");
  exit(1);
 }
 bzero(&addr,sizeof(addr));
 addr.sin_family=af_inet;
 addr.sin_addr.s_addr=htonl(inaddr_any);
 addr.sin_port=htons(port);
 printf("server udp port=%d\",port);
 if(bind(fd,(struct sockaddr *)&addr,sizeof(addr))<0)
 {
  fprintf(stderr,"bind error\");
  exit(1);
 }
 if((flags=fcntl(fd,f_getfl,0))<0)
 { fprintf(stderr,"fcntl f_getfl error\");
  exit(1);
 };
 flags|=o_nonblock;
 if(fcntl(fd,f_setfl,flags)<0)
 {
  fprintf(stderr,"fcntl f_setfl error\");
  exit(1);
 }
 return(fd);
};


int opensocket_domainudp(char *fname)
{
 int flags;
 int fd;
 struct sockaddr_un addr;
 fd=socket(af_unix,sock_dgram,0);
 if(fd<0)
 {
  perror("unix domain socket");
  exit(1);
 }
 unlink(fname);
 bzero(&addr,sizeof(addr));
 addr.sun_family=af_unix;
 strcpy(addr.sun_path,fname);
 if(bind(fd,(struct sockaddr *)&addr,sizeof(addr))<0)
 {
  perror("unix domain bind");
  exit(1);
 }
 if((flags=fcntl(fd,f_getfl,0))<0)
 { perror("unix domain getfl");
  exit(1);
 };
 flags|=o_nonblock;
 if(fcntl(fd,f_setfl,flags)<0)
 {
  perror("unix domain setfl");
  exit(1);
 }
 return(fd);
};


int opensocket_domainclient(char *fname,int fd)
{
 int flags;
 struct sockaddr_un here={af_unix,""};

 if(fd<=0)
 {
 fd=socket(af_unix,sock_dgram,0);
 if(fd<0)
 {
  perror("unix domain socket");
  exit(1);
 }
 if((flags=fcntl(fd,f_getfl,0))<0)
 { perror("unix domain getfl");
  exit(1);
 };
 flags|=o_nonblock;
 if(fcntl(fd,f_setfl,flags)<0)
 {
  perror("unix domain setfl");
  exit(1);
 }
 return(fd);
 };
 strcpy(here.sun_path,fname);
 if(connect(fd,(struct sockaddr *)&here,sizeof(here))<0)
  {
  perror("unix domain connect");
  return(0);
 }
 return(1);
};

void send2server(int fd,int *pstatus,char *fname,char *s,int len)
{ int ret;
 printf("domain:%s\",s);
 if(*pstatus!=1)
 *pstatus=opensocket_domainclient(fname,fd);
 if(*pstatus!=1) return;
 ret=write(fd,s,len);
 if(ret<=0)
 { *pstatus=0;
  perror("graph write");
 }
};