<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>solaris</title><link>http://blog.vckbase.com/freedk/category/815.html</link><description>solaris</description><managingEditor>自由空间</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>自由空间</dc:creator><title>proxy可编绎版本</title><link>http://blog.vckbase.com/freedk/archive/2005/12/06/15649.html</link><pubDate>Tue, 06 Dec 2005 01:33:00 GMT</pubDate><guid>http://blog.vckbase.com/freedk/archive/2005/12/06/15649.html</guid><wfw:comment>http://blog.vckbase.com/freedk/comments/15649.html</wfw:comment><comments>http://blog.vckbase.com/freedk/archive/2005/12/06/15649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/freedk/comments/commentRss/15649.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/freedk/services/trackbacks/15649.html</trackback:ping><description>&lt;P&gt;&lt;FONT face=Arial color=#0000ff&gt;编绎：gcc -g proxy -o proxy -lnsl -lsocke&lt;BR&gt;使用方法:proxy 本地端口 远程计算机 远程计算机端口&lt;BR&gt;目前在solaris 10下测试OK&lt;BR&gt;&lt;BR&gt;/*代理服务器源代码proxy.c*/&lt;BR&gt;#include &amp;lt;stdio.h&amp;gt;&lt;BR&gt;#include &amp;lt;ctype.h&amp;gt;&lt;BR&gt;#include &amp;lt;errno.h&amp;gt;&lt;BR&gt;#include &amp;lt;strings.h&amp;gt;&lt;BR&gt;#include &amp;lt;netdb.h&amp;gt;&lt;BR&gt;#include &amp;lt;signal.h&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#0000ff&gt;#include &amp;lt;sys/socket.h&amp;gt;&lt;BR&gt;#include &amp;lt;sys/file.h&amp;gt;&lt;BR&gt;#include &amp;lt;sys/ioctl.h&amp;gt;&lt;BR&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;BR&gt;#include &amp;lt;sys/stat.h&amp;gt;&lt;BR&gt;#include &amp;lt;sys/fcntl.h&amp;gt;&lt;BR&gt;#include &amp;lt;sys/termios.h&amp;gt;&lt;BR&gt;#include &amp;lt;arpa/inet.h&amp;gt;&lt;BR&gt;#include &amp;lt;netinet/in.h&amp;gt;&lt;BR&gt;#include &amp;lt;inttypes.h&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#0000ff&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#0000ff&gt;#define&amp;nbsp;TCP_PROTO&amp;nbsp;"tcp"&lt;BR&gt;#define INADDR_NONE 0xffffffff&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#0000ff&gt;int proxy_port;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*全局变量，指定代理服务器的端口*/ &lt;BR&gt;struct sockaddr_in hostaddr;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*全局变量，远端主机地址*/ &lt;BR&gt;extern int errno;&lt;BR&gt;char *sys_myerrlist[];&lt;BR&gt;void parse_args(int argc, char **argv);&amp;nbsp;/*参数转换函数*/&lt;BR&gt;void daemonize(int servfd);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*创建守护进程函数*/&lt;BR&gt;void do_proxy(int usersockfd);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*代理处理函数*/&lt;BR&gt;void errorout(char *msg);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*错误输出函数*/&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face=Arial color=#0000ff&gt;/*********************************************************&lt;BR&gt;主函数&lt;BR&gt;**********************************************************/&lt;BR&gt;void main (int argc,char **argv)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;int clilen;&lt;BR&gt;&amp;nbsp;int childpid;&lt;BR&gt;&amp;nbsp;int sockfd, newsockfd;&lt;BR&gt;&amp;nbsp;struct sockaddr_in servaddr, cliaddr;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*把命令行参数转存到全局变量中*/&lt;BR&gt;&amp;nbsp;parse_args(argc,argv);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*为侦听客户请求准备一个地址*/&lt;BR&gt;&amp;nbsp;bzero((char *) &amp;amp;servaddr, sizeof(servaddr));&lt;BR&gt;&amp;nbsp;servaddr.sin_family = AF_INET;&lt;BR&gt;&amp;nbsp;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);&lt;BR&gt;&amp;nbsp;servaddr.sin_port = proxy_port;&lt;BR&gt;&amp;nbsp;/*得到一个端口的文件描述符*/&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) &amp;lt; 0)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;fputs("failed to create server socket\r\n",stderr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;exit(1);&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*绑定到前面的地址上*/&lt;BR&gt;&amp;nbsp;if(bind(sockfd,(struct sockaddr_in *) &amp;amp;servaddr,sizeof(servaddr)) &amp;lt; 0)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;fputs("faild to bind server socket to specified port\r\n",stderr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;exit(1);&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*准备接收*/&lt;BR&gt;&amp;nbsp;listen(sockfd,5);&lt;BR&gt;&amp;nbsp;/*把自身变为守护进程*/&lt;BR&gt;&amp;nbsp;daemonize(sockfd);&lt;BR&gt;&amp;nbsp;/*进入一个循环，并发处理连接请求*/&lt;BR&gt;&amp;nbsp;while (1)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*接受连接请求*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;clilen = sizeof(cliaddr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;newsockfd = accept(sockfd, (struct sockaddr_in *) &amp;amp;cliaddr, &amp;amp;clilen);&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (newsockfd &amp;lt; 0 &amp;amp;&amp;amp; errno == EINTR)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;else if (newsockfd &amp;lt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*出错，kill服务器*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;errorout("failed to accept connection");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*产生一个子进程，进行连接处理*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ((childpid = fork()) == 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(sockfd);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;do_proxy(newsockfd); &amp;nbsp;&amp;nbsp;/*真正的处理过程*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*如果产生子进程失败，连接将被丢掉*/ &lt;BR&gt;&amp;nbsp;&amp;nbsp;close(newsockfd);&lt;BR&gt;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;exit(0);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#0000ff&gt;/**************************************************************** &lt;BR&gt;进行参数转换，把从命令行得到的参数值赋给全局变量&lt;BR&gt;****************************************************************/ &lt;BR&gt;void parse_args (int argc,char **argv) &lt;BR&gt;{&lt;BR&gt;&amp;nbsp;int i;&lt;BR&gt;&amp;nbsp;struct hostent *hostp;&lt;BR&gt;&amp;nbsp;struct servent *servp;&lt;BR&gt;&amp;nbsp;unsigned long inaddr;&lt;BR&gt;&amp;nbsp;struct{&lt;BR&gt;&amp;nbsp;&amp;nbsp;char proxy_port [16];&lt;BR&gt;&amp;nbsp;&amp;nbsp;char isolated_host [64];&lt;BR&gt;&amp;nbsp;&amp;nbsp;char service_name [32];&lt;BR&gt;&amp;nbsp;}pargs;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#0000ff&gt;&amp;nbsp;/*输入不合规范*/&lt;BR&gt;&amp;nbsp;if (argc &amp;lt; 4)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;printf("usage: %s &amp;lt;proxy-port&amp;gt; &amp;lt;host&amp;gt; &amp;lt;service-name|port-number&amp;gt;\r\n", argv[0]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;exit(1);&lt;BR&gt;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*（将什么）将输入参数先放到自定义的数据结构中*/&lt;BR&gt;&amp;nbsp;strcpy(pargs.proxy_port,argv[1]);&lt;BR&gt;&amp;nbsp;strcpy(pargs.isolated_host,argv[2]);&lt;BR&gt;&amp;nbsp;strcpy(pargs.service_name,argv[3]);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*检查端口号是否是数字，再赋给proxy_port*/&lt;BR&gt;&amp;nbsp;for (i = 0; i &amp;lt; strlen(pargs.proxy_port); i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (!isdigit(*(pargs.proxy_port + i)))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (i == strlen(pargs.proxy_port))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy_port = htons(atoi(pargs.proxy_port));&lt;BR&gt;&amp;nbsp;&amp;nbsp;else{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("%s: invalid proxy port\r\n",pargs.proxy_port);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*把远端服务器地址赋给hostaddr*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;bzero(&amp;amp;hostaddr,sizeof(hostaddr));&lt;BR&gt;&amp;nbsp;&amp;nbsp;hostaddr.sin_family = AF_INET;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*不管是主机名还是IP地址，都把它转换为hostaddr 的地址*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ((inaddr = inet_addr(pargs.isolated_host)) != INADDR_NONE)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;bcopy(&amp;amp;inaddr,&amp;amp;hostaddr.sin_addr,sizeof(inaddr));&lt;BR&gt;&amp;nbsp;&amp;nbsp;else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((hostp = gethostbyname(pargs.isolated_host)) != NULL)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bcopy(hostp-&amp;gt;h_addr,&amp;amp;hostaddr.sin_addr,hostp-&amp;gt;h_length);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("%s: unknown host\r\n",pargs.isolated_host);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*不管是用数字表示端口还是用服务表示的端口，都把它转换后赋给hostaddr.sin_port*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((servp = getservbyname(pargs.service_name,TCP_PROTO)) != NULL)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hostaddr.sin_port = servp-&amp;gt;s_port;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if (atoi(pargs.service_name) &amp;gt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hostaddr.sin_port = htons(atoi(pargs.service_name));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("%s: invalid/unknown service name or port number\r\n", pargs.service_name);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#0000ff&gt;/**************************************************************** &lt;BR&gt;创建守护进程函数&lt;BR&gt;****************************************************************/ &lt;BR&gt;void daemonize (int servfd)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;int childpid, fd, fdtablesize;&lt;BR&gt;&amp;nbsp;/*忽略终端I/O读、写和stop 信号*/&lt;BR&gt;&amp;nbsp;signal(SIGTTOU,SIG_IGN);&lt;BR&gt;&amp;nbsp;signal(SIGTTIN,SIG_IGN);&lt;BR&gt;&amp;nbsp;signal(SIGTSTP,SIG_IGN);&lt;BR&gt;&amp;nbsp;/*通过fork子进程，kill父进程，把自身转入后台*/&lt;BR&gt;&amp;nbsp;if ((childpid = fork()) &amp;lt; 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;fputs("failed to fork first child\r\n",stderr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;exit(1);&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;else if (childpid &amp;gt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;exit(0); /*若是父进程，结束*/&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*设为会话组长，摆脱原终端*/&lt;BR&gt;&amp;nbsp;setsid(0);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*释放控制终端*/&lt;BR&gt;&amp;nbsp;if ((fd = open("/dev/tty",O_RDWR)) &amp;gt;= 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;ioctl(fd,TIOCNOTTY,NULL);&lt;BR&gt;&amp;nbsp;&amp;nbsp;close(fd);&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*关闭除 servfd 外的所有文件描述符*/&lt;BR&gt;&amp;nbsp;for (fd = 0, fdtablesize = getdtablesize(); fd &amp;lt; fdtablesize; fd++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (fd != servfd)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(fd);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*改变工作目录到根目录*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;chdir("/");&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*重设文件掩码*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;umask(0);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face=Arial color=#0000ff&gt;/*************************************************** &lt;BR&gt;代理处理函数&lt;BR&gt;****************************************************************/ &lt;BR&gt;void do_proxy (int usersockfd)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;int isosockfd;&lt;BR&gt;&amp;nbsp;fd_set rdfdset;&lt;BR&gt;&amp;nbsp;int connstat;&lt;BR&gt;&amp;nbsp;int iolen;&lt;BR&gt;&amp;nbsp;char buf[2048];&lt;BR&gt;&amp;nbsp;/*作为一个客户端，新开一个端口以连接远端服务器*/&lt;BR&gt;&amp;nbsp;if ((isosockfd = socket(AF_INET,SOCK_STREAM,0)) &amp;lt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;errorout("failed to create socket to host");&lt;BR&gt;&amp;nbsp;/*发连接请求*/&lt;BR&gt;&amp;nbsp;connstat = connect(isosockfd,(struct sockaddr *) &amp;amp;hostaddr, sizeof(hostaddr));&lt;BR&gt;&amp;nbsp;/*出错处理*/&lt;BR&gt;&amp;nbsp;switch (connstat){&lt;BR&gt;&amp;nbsp;&amp;nbsp;case 0:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;case ETIMEDOUT:&lt;BR&gt;&amp;nbsp;&amp;nbsp;case ECONNREFUSED:&lt;BR&gt;&amp;nbsp;&amp;nbsp;case ENETUNREACH:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy(buf,sys_myerrlist[errno]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat(buf,"\r\n");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;write(usersockfd,buf,strlen(buf));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(usersockfd);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit(1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;default:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;errorout("failed to connect to host");&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;/*现在已经建立了连接，进入代理的数据反馈循环*/&lt;BR&gt;&amp;nbsp;while (1) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;/* 使用select进行并发处理 */&lt;BR&gt;&amp;nbsp;&amp;nbsp;FD_ZERO(&amp;amp;rdfdset);&lt;BR&gt;&amp;nbsp;&amp;nbsp;FD_SET(usersockfd,&amp;amp;rdfdset);&lt;BR&gt;&amp;nbsp;&amp;nbsp;FD_SET(isosockfd,&amp;amp;rdfdset);&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (select(FD_SETSIZE,&amp;amp;rdfdset,NULL,NULL,NULL) &amp;lt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;errorout("select failed");&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*客户端有数据发过来吗*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (FD_ISSET(usersockfd,&amp;amp;rdfdset)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*小于或等于0意味着客户端已断*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if((iolen=recv(usersockfd,buf,sizeof(buf),0)) &amp;lt;= 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;send(isosockfd,buf,iolen,0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*把数据拷贝一份发给服务器端*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;/*远端服务器有数据发过来吗*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (FD_ISSET(isosockfd,&amp;amp;rdfdset)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if((iolen = recv(isosockfd,buf,sizeof(buf),0)) &amp;lt;= 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; /*接收数据长度小于或等于0标明连接已断*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;send(usersockfd,buf,iolen,0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*把数据拷贝一份发给客户端*/&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;close(isosockfd);&lt;BR&gt;&amp;nbsp;close(usersockfd);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial color=#0000ff&gt;/**************************************************************** &lt;BR&gt;出错处理函数&lt;BR&gt;****************************************************************/ &lt;BR&gt;void errorout(char *msg)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;FILE *console;&lt;BR&gt;&amp;nbsp;console = fopen("/dev/console","a");&lt;BR&gt;&amp;nbsp;fprintf(console,"proxyd: %s\r\n",msg);&lt;BR&gt;&amp;nbsp;fclose(console);&lt;BR&gt;&amp;nbsp;exit(1);&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/freedk/aggbug/15649.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>自由空间</dc:creator><title>Solaris tip</title><link>http://blog.vckbase.com/freedk/archive/2005/10/29/14258.html</link><pubDate>Sat, 29 Oct 2005 00:31:00 GMT</pubDate><guid>http://blog.vckbase.com/freedk/archive/2005/10/29/14258.html</guid><wfw:comment>http://blog.vckbase.com/freedk/comments/14258.html</wfw:comment><comments>http://blog.vckbase.com/freedk/archive/2005/10/29/14258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/freedk/comments/commentRss/14258.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/freedk/services/trackbacks/14258.html</trackback:ping><description>&lt;FONT face=宋体 color=#0000ff&gt;&amp;nbsp; 用tip可以测试设备是否连接，如tip test，呵呵，test在/etc/remote中要有哦。如果正常，显示&amp;#8221;connected&amp;#8221;。在Terminal 终止tip，按'~.'。&lt;/FONT&gt;&lt;img src ="http://blog.vckbase.com/freedk/aggbug/14258.html" width = "1" height = "1" /&gt;</description></item></channel></rss>