UDP 통신에서의 fork.
글쓴이: 김학수 / 작성시간: 화, 2003/05/13 - 10:13오후
udp 통신 프로그램을 짜고 있습니다...
데이터를 받은 후 fork 를 하여 받은 데이터를 처리하고.. 처리하는 동안
새로오는 데이터도 물론 처리를 해야겠죠..
제가 만드는 대략적인 소스입니다..
여러가지를 빼서 간단하게 추리다 보니 이해가 안되는 부분이 있을지 모르나
대충 아 이렇게 흘러가는구나 하는 정도는 아시리라 믿습니당..
#include "all.h"
int task_no;
int sun_sock;
int web_serial;
main()
{
int ret;
int Pid;
char rbuf[512];
int len;
int cli_len; /* for udp socket */
struct sockaddr_in clie_addr;
int tport = 8888;
char msg[512];
sleep(5);
ret = udp_port_init(&sun_sock, tport);
if(ret < 0) printf("UDP Port [%d] Init Error" , tport);
while(1)
{
len = recvfrom(sun_sock, rbuf, sizeof(rbuf), 0, (struct sockaddr *)&clie_addr, &cli_len);
if(len > 0)
{
Pid = fork();
if (Pid == 0)
{
Child_Proc(rbuf);
}
else
{
printf("Fork Error");
}
}
}
}
Child_Proc(char *buf)
{
printf ("자식 프로세스 처리합니다...");
/* 버퍼 가지구 이리볶구 저리볶구.... */
}
위와 같은 방식으로 하는데.. 컴파일을 시켜서 돌려보니
처음 받은 데이터를 처리한 다음 계속 udp port init 에러가 납니다.
뭔가 잘못된게 확실한데...
어떻게 처리를 해야 하나요?
fork 의 위치가 잘못된건지.. 아님 다른 문제가 ?
길을 보여주시면 감사하겠습니다..
Forums:


해당 프로그램을 구동한 후에 하나의 UDP packet에 대해 처리한 후
해당 프로그램을 구동한 후에 하나의 UDP packet에 대해 처리한 후에 다음 packet 부터 오류가 난다는 말씀이신지 아니면 다음 구동시에 오류가 난다는 말씀이신지 잘 모르겠군요.
udp_port_init()을 while loop 전에 호출하니 첫번째 경우는 아닐것 같은데요...
두번째 경우라면 오류가 나는 지점에서 perror()로 오류 내용을 출력해서 보여주시면 좋겠네요.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
하나의 패킷을 처리한 후 에러가 납니다.
하나의 패킷을 처리한 후..
윗단의 포트 init 하는 곳에서 계속 에러가 나는거죠..
실 프로그램에서는 프로세스가 죽으면 계속 프로세스를 재구동 시킵니다.
하지만 포트 init 하는 부분에서 계속 에러가 발생하면서 프로세스가 죽고.
계속 재구동되고 그렇죠... ㅡㅡ;;;
하나의 packet을 처리한 후에 udp_port_init()을 누가 호
하나의 packet을 처리한 후에 udp_port_init()을 누가 호출하죠?
parent process는 while loop 안에서 계속 recvfrom() 하고 있는것 아닌가요?
설마 child 가???
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
안녕하세요..... 제가 소스를 대충 보니 문제가 있긴 있는것 같
안녕하세요.....
제가 소스를 대충 보니 문제가 있긴 있는것 같네요...
지금 while() 문 안에서 recvfrom()을 호출하고 그 다음에
자식 프로세스를 생성하잖습니까....
그럼 자식이 수신한 데이터를 처리하고 나면 어떻게 되겠습니까?
당연히 while() 문 안의 recvfrom() 부터 자식이 또 처리할려고
하지 않습니까.....
그럼 또 fork()를 수행할테고.....
그럼 프로세스가 계속 생성되어 최종적으로는 더이상 프로세스를
생성할 수 없을때까지 일이 진행 되겠지요.....
그러니까 자식 프로세스는 다음 부분에서 break로 빠져
나가는 루틴을 추가한 후 해보십시오.
while (1) {
어쩌고저쩌고;
pid = fork(); ==> 또 fork()를 수행하네요...
if (Pid == 0)
{
Child_Proc(rbuf);
break; ==> 이 부분이 있어야 다시 recvfrom을 안하죠!
}
감사합니다
fork 다음에 break 를 하는게 좋겠군요..
간단히 프로그램을 다시 짜서 해봤는데. 잘 됩니다.
감사합니다.
댓글 달기