下列函数用于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");
}
};


意见与建议
沪ICP证:沪B2-20070217 版权所有:东方财富网



