|
|
我最近修改编写了一个proxy程序,主要负责客户机与服务器之间的HTTP数据转发,主体如下:
- if((isosockfd=socket(AF_INET,SOCK_STREAM,0))<0)
- errorout("failed to create socket to host\n");
- connstat=connect(isosockfd,(struct sockaddr *)&hostaddr,sizeof(hostaddr));
- switch(connstat)
- {
- case 0:
- break;
- case ETIMEDOUT:
- case ECONNREFUSED:
- case ENETUNREACH:
- //strcpy(buf,sys_myerrlist[errno]);
- strcat(buf,"\r\n");
- write(usersockfd,buf,strlen(buf));
- close(usersockfd);
- exit(1);
- default:
- errorout("failed to connect to host\n");
- break;
- }
-
-
- while(1)
- {
- FD_ZERO(&rdfdset);
- FD_SET(usersockfd,&rdfdset);
- FD_SET(isosockfd,&rdfdset);
-
- if(select(FD_SETSIZE,&rdfdset,NULL,NULL,NULL)<0)
- errorout("select failed\n");
- if(FD_ISSET(usersockfd,&rdfdset))
- {
- if((iolen=read(usersockfd,buf,sizeof(buf)))<=0)
- break;
- write(isosockfd,buf,iolen);
- }
- if(FD_ISSET(isosockfd,&rdfdset))
- {
- if((iolen=read(isosockfd,buf,sizeof(buf)))<=0)
- break;
- edit_data(buf);/*********************/
- printf("%s\n",buf);
- write(usersockfd,buf,iolen);
- }
- }//end while
- close(isosockfd);
- close(usersockfd);
复制代码
edit_data函数用来对buf中的数据进行过滤修改,也就是对服务器向客户机传送的HTML代码进行过滤,但是这样一来,客户机无法显示网页。如果屏蔽edit_data函数,只做转发,则一切正常。
通过查找资料发现,HTML代码属于UNICODE,而我编写的edit_data函数中对buf[ ]定义为char类型,故造成数据在write时不完整。
现在我不知道该如何在不破坏UNICODE代码的同时,还能对它进行修改,希望高手指点或者推荐相关资料以供学习。
急求解决方法,这里先谢谢大家了。 |
|