
다음은 기본 클라이언트 및 서버 코드입니다. 연결 호출 중에 응용 프로그램을 시작하려고 하는 동안(서버에 메시지를 보낸 후에는 응용 프로그램이 컴퓨터에서 계속 실행되어야 합니다). 클라이언트 코드에서 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);