[1796+1799]리플_답변 + 질문입니다.

[질문1] 웹의 응답이 늦을때...(time_out)일때는 어떻게 처리해야 하늦
지??
[질문2] 구조를 더 깔끔하게 할 수 없을까요? (성능을 높게..)
현사양 아파치 웹서버+PHP
작업 의도 폰이 올려 주는 "get~~스트링"을 웹에 올려주고,
웹의 결과를 다시 폰으로 넘겨주는 프로그램
요구사항 당연히..폰1,폰2,폰3 이렇게 폰은 여러개 이어야 함
이런 것을 고려하여..아래와 같이 만들었습니다.
fork(), int server_fd, /* 처음 bind할 소켓자신*/
middle_fd, // 폰과 통신할 소켓
web_to_fd;// 웹과 통신할 소켓
을 이용해서
server=socket(..);
setsockopt(server_fd,SOL_SOCKET, SO_REUSEADDR, (const char *)
&optval,sizeof(int));
while(1){
accept();
if(0==fork(){
close(server_fd); //
웹과 소켓 통신열고
1. 폰에서 데이터 받고,
2. 웹으로 데이터 보내고
3. 웹에서 데이터 받고
4. 폰으로 데이터 보내고.
close(middle, web);
}
else{ //부모
close(middle);
;
}
이런 구조로 만들었습니다.. printf()문이 조금 지저분하죠^^*
===========> 실제 소스를 첨가하면..
#include
#include
#include
#include
#include
#include
#define MAXLINE 16000
char *escape="exit";
int main(int argc,char *argv[])
{
int server_fd, middle_fd, web_to_fd;
int done=0;
pid_t pid;
struct sockaddr_in server_addr,middle_addr ,web_to_addr;
int middle_len;
int R_W_len, len;
char conn_buff[MAXLINE];
int optval=1;
/*server_fd phone 에서 廈【?올라오는 것을 받을 나 자신*/
if((server_fd=socket(PF_INET, SOCK_STREAM, 0))<0)
{ printf("server_fd Error"); exit(0);}
bzero((char *)&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=inet_addr("XXX.XXX.XXX.XXX"); /*htonl
(INADDR_ANY);*/
server_addr.sin_port=htons(31992);
setsockopt(server_fd,SOL_SOCKET, SO_REUSEADDR, (const char *)
&optval,sizeof(int));
if( bind( server_fd,(struct sockaddr *)&server_addr,sizeof
(server_addr) ) <0)
{printf("bind Error\n");exit(0);}
printf("middle start==>\n");
listen(server_fd,100);
middle_len=sizeof(middle_addr);
MIID
if((middle_fd = accept(server_fd,(struct sockaddr *)
&middle_addr, &middle_len)) < 0)
{ printf("accept Error\n"); exit(0);}
if((pid=fork())<0)/* 에러 */
{
close(server_fd);
close(middle_fd);
exit(-1);
}
else if(pid>0)/* */
{
printf("child_fake");
/* if((middle_fd = accept(server_fd,(struct sockaddr *)
&middle_addr, &middle_len)) < 0)
{ printf("accept Error\n"); exit(0);}
*/
close(middle_fd);
goto MIID;
}
else if(pid==0)/* */
{
close(server_fd);
printf("==>parents\n");
if((web_to_fd=socket(PF_INET, SOCK_STREAM, 0)) <0)
{printf("web socket Error\n"); exit(-1);}
bzero( (char *)&web_to_addr, sizeof(web_to_addr) );
web_to_addr.sin_family=AF_INET;
web_to_addr.sin_addr.s_addr=inet_addr("211.55.45.45");
/* web_to_addr.sin_port=htons(31996); web connecting port */
web_to_addr.sin_port=htons(80);
if( connect(web_to_fd, (struct sockaddr *)&web_to_addr,
sizeof(web_to_addr) ) < 0 )
{printf("Sconnect to web Error\n"); close(middle_fd); exit(-
1);}
printf("==>connecting...\n");
R_W_len=90;/* 임의의 값 얼마 바든가 보긱위해서 */ memset
(conn_buff,0x0,sizeof(conn_buff));
done=0;
while(1)
{
if(done==0 || done ==1) /* read from phone */
{
int len=0;
printf("read==>\n");
memset(conn_buff,0x0,sizeof(conn_buff));
R_W_len=0;
if((R_W_len = read(middle_fd,conn_buff,MAXLINE)) < 0)
{ printf("Sreading from phone Error"); close(middle_fd);
close(web_to_fd); exit(-1); }
printf("R_W_LEN=[%d]",R_W_len);
printf("[");
for(len=0;len
{printf("%c",conn_buff[len]);}
printf("]");
done=2;
}
else if(done==2 ) /* write to web */
{
int len=0;
printf("write to web=R_W_LEN=[%d]\n",R_W_len);
usleep(200);
if(write(web_to_fd,conn_buff,R_W_len) !=R_W_len )
{ printf("web to write Error length\n"); close
(middle_fd); close(web_to_fd); exit(-1); }
usleep(100);
printf("write to web end\n");
done=3;
}
else if(done ==3 ) /* read from web */
{
int len=0;
printf("i=================read from Web==>\n");
memset(conn_buff,0x0,sizeof(conn_buff));
R_W_len=0;
if((R_W_len = read(web_to_fd,conn_buff,MAXLINE)) < 0)
{ printf("Sreading from Web Error"); close
(middle_fd); close(web_to_fd); exit(-1); }
printf("R_W_LEN=[%d]",R_W_len);
printf("[");
for(len=0;len
{printf("%c",conn_buff[len]);}
printf("]");
done=4;
}
else if(done ==4) /* write to phone and setting 1 */
{
/* int check=0;
printf("write to phone before R_W_len=[%d]\n",R_W_len);
usleep(100);
if((check=write(middle_fd,conn_buff,R_W_len-1)) !
=R_W_len-1 )
{ printf("web to write Error length\n"); close
(middle_fd); close(web_to_fd); exit(-1); }
printf("write to phone end length =[%d]\n",check);
usleep(100);
done=1;
usleep(100000);
*/
int check=0;
int len=0;
printf("write to phone start==>r_w_len=[%d]
\n",R_W_len);
for(len=0 ; len < (R_W_len) ; len++)
{
if((check=write(middle_fd,&conn_buff[len],1)) < 0 )
{ printf("web to write Error length\n"); close
(middle_fd); close(web_to_fd); exit(-1); }
}
printf("write to phone check=[%d], len=[%d] <== end
\n",check,len);
usleep(1000);
done=1;
usleep(10000);
done=5;
close(middle_fd);
close(web_to_fd);
}
else if(done ==5){break;}
else{ printf("done ERROR\n"); close(middle_fd); close
(web_to_fd); exit(-1); }
}/* while */
printf("==>child\n");
}
else{;}
}
HTTP/1.1 200 OK
Date Thu, 12 Sep 2002 103350 GMT
Server Apache/1.3.20 (Unix) Resin/2.0.5 PHP/4.1.1
mod_ssl/2.8.4 OpenSSL/0.9.6a X-Powered-By PHP/4.1.1
Connection close
Content-Type text/html
XXXXX(데이터)
우선 아파치 서버는 한번에 웹페이지의
헤더부와 바디부(XXXXX(데이터))를 보내줍니다
1. 웹에서 데이터를 받아올때 TIME-OUT값을 설정해두세요. 웹에서 반응이
무지 느릴때가 왕왕있드라구요. 저는 RECV()용 함수를 SELECT로 따로 만들
어서 해결했습니다
5. 인증은 헤더부의 쿠키 정보를 이용해보세요
댓글 달기