데몬 애플리케이션이 클라이언트에서 시작되므로 서버 포트는 더 이상 수신 대기를 반환하지 않고 종료 대기 상태에 있습니다.

데몬 애플리케이션이 클라이언트에서 시작되므로 서버 포트는 더 이상 수신 대기를 반환하지 않고 종료 대기 상태에 있습니다.

다음은 기본 클라이언트 및 서버 코드입니다. 연결 호출 중에 응용 프로그램을 시작하려고 하는 동안(서버에 메시지를 보낸 후에는 응용 프로그램이 컴퓨터에서 계속 실행되어야 합니다). 클라이언트 코드에서 system(/bin/myApplication) 사용(이것은 기본적으로 내 응용 프로그램이 실행되어야 한다고 가정할 때 무한 루프가 있는 간단한 c 실행 파일입니다.) 일단 iam이 응용 프로그램을 시작하면 서버는 CLOSED_WAIT 상태에 있으며, 앱을 중지하면 다시 듣기로 돌아갑니다. 문제는 서버 소켓이 CLOSED_WAIT 상태에 있다는 것입니다. 애플리케이션을 별도의 프로세스로 계속 실행하고 서버가 다시 수신 상태에 있게 되는 방법이 있습니까? 클라이언트 코드: 읽은 후 애플리케이션을 시작하는 시스템 명령이 있습니다(기본적으로 무한 while 루프가 있는 c 실행 파일).

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h> 

int main(int argc, char *argv[])
{
int sockfd = 0, n = 0;
char recvBuff[1024];
struct sockaddr_in serv_addr; 

if(argc != 2)
  {
    printf("\n Usage: %s <ip of server> \n",argv[0]);
    return 1;
} 

memset(recvBuff, '0',sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
    printf("\n Error : Could not create socket \n");
    return 1;
} 

memset(&serv_addr, '0', sizeof(serv_addr)); 

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(5000); 

if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
{
    printf("\n inet_pton error occured\n");
    return 1;
} 

if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
   printf("\n Error : Connect Failed \n");
   return 1;
} 

while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
    recvBuff[n] = 0;
    if(fputs(recvBuff, stdout) == EOF)
    {
        printf("\n Error : Fputs error\n");
    }
} 
system(/bin/myApplication);
if(n < 0)
{
    printf("\n Read error \n");
} 

return 0;

서버 코드:

int main(int argc, char *argv[])
{
int listenfd = 0, connfd = 0;
struct sockaddr_in serv_addr; 

char sendBuff[1025];
time_t ticks; 

listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff)); 

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(5000); 

bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

listen(listenfd, 10); 

while(1)
{
    connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 

    ticks = time(NULL);
    snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));
    write(connfd, sendBuff, strlen(sendBuff)); 

    close(connfd);
    sleep(1);
 }

}

while 루프 int main(int argc, char *argv[]) {가 포함된 ac 파일인 내 샘플 애플리케이션

while(1)

{

}
return 1;
}
gcc myApplicaion.c -o myApplication

포크를 사용해 보았지만 응용 프로그램이 단독으로 실행되고 소켓에 영향을 주지 않거나 부모 프로세스(여기서는 서버)에 의존하지 않는지 여부에 관계없이 소켓은 여전히 ​​동일한 상태에 있습니다.

답변1

"myApplication"을 실행하기 전에 클라이언트에서 소켓을 닫아 보셨나요?

while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
    recvBuff[n] = 0;
    if(fputs(recvBuff, stdout) == EOF)
    {
        printf("\n Error : Fputs error\n");
    }
} 
/* close the socket here*/
close(sockfd);

system(/bin/myApplication);

관련 정보