클라이언트와 접속을 유지 하고 싶은데요
클라이언트가 요청한 데이타를 보내면 서버가 접속을 끊어 버리네요.
다른 데이타도 한번 접속이 된 상태에서 데이타를 주고 받아야 되는데요.
서버에서 접속이 계속 유지 될수 있게 할려면 어떻게 처리를 해줘야 되나
요?
int main(int argc,char *argv[]){
char strBuffer[bufsize];
int server_fd,client_fd,clilen,size;
struct sockaddr_in client_addr, server_addr;
pid_t pid;
....
if(bind(server_fd,(struct sockaddr *)&server_addr,sizeof(server_addr))<0)
{
printf("Server Can't bind local address.\n");
return -1;
}
listen(server_fd,5);
signal(SIGCHLD,SIG_IGN);
for(;;){
clilen=sizeof(client_addr);
if((client_fd=accept(server_fd,(struct sockaddr *) &client_addr,&clilen))!=-1)
{
printf("Server Client Connected \n");
printf("IP %s\n",inet_ntoa(client_addr.sin_addr));
}
else
{
printf("Server failed in accept.\n");
return -1;
}
sleep(5);
if((pid=fork())<0){
printf("fork error\n");
exit(0);
}
else if(pid==0){
close(server_fd);
while(1){
if(( size=recv(client_fd,strBuffer,BILL_HEADER,0))>0){
printf("step1\n");
if(size!=BILL_HEADER){
printf("Recv Header fail\n");
// error 처리
}
size=recv(client_fd,strBuffer+HEADER,htonl(recv->stHeader.Length)-HEADER,0);
if(size!=htonl(recv->stHeader.Length)-HEADER)
{
printf("Recv Data fail\n");
// error 처리
}
if(!strcmp(recvPacket->stHeader.Qos,"AAA"))
{
if(iAAA(client_fd,strBuffer+HEADER)<0){
printf("[AAA] Procss Fail \n");
// error 처리
}
close(client_fd);
exit(0);
}
else{
printf("******** 클라이언트로부터 데이타 받은 데이타 *************\n");
check_recv(recvPacket,client_fd);
} // else
} // if recv
} //while
} //else if
close(client_fd);
} //for
}
Re: 추가질문
위에 소스대로 서버를 돌렸을때, 클라이언트가 데이타를 한번전송했을때에
는 데이타가 들어와서 일을 잘 처리합니다.
그런데, 클라이언트에서 두번째 데이타를 전송했을때에는 데이타가 Recv-Q
에 대기만 하고 서버쪽에 주지 않더라구요.
어떻게해야 데이타를 받아 올수 이을까요? ㅜㅡ.
잠도 안오네요.빨리 해결해야 될텐데
댓글 달기