- 論壇徽章:
- 0
|
#include <sys/types.h>
#include <stropts.h>
#include "ourhdr.h"
int recv_fd(int servfd,ssize_t(*userfunc)(int,const void *,size_t))
{
int newfd, nread, flag, status;
char *ptr , buf[MAXLINE];
struct strbuf dat;
struct strrecvfd recvfd;
status=-1;
for( ; ; )
{
dat.buf=buf;
dat.maxlen=MAXLINE;
flag=0;
if(getmsg(servfd,NULL,&dat,&flag)<0) 從流管道讀流消息
printf("getmsg error" ;
nread=dat.len;
if(nread==0)
{
printf("connection closed by server" ;
return(-1);
}
for(ptr=buf;ptr<&buf[nread]
{
if(*ptr++==0)
{
if(ptr!=&buf[nread-1])
printf("message format error" ;
status=*ptr&255;
if(status==0)
{
if(ioctl(servfd,I_RECVFD,&recvfd)<0) 從流管道讀文件描述符
return(-1);
newfd=recvfd.fd;
}else
{
newfd=-status;
}
nread-=2;
}
}
if(nread>0)
if((*userfunc)(STDERR_FILENO,buf,nread)!=nread)
return(-1);
if(status>=0)
return(newfd);
}
}
第一次怎么沒有讀到文件描述符?怎樣才算讀取一個(gè)流消息結(jié)束?不解請高手指教!謝謝 |
|