[apue] syslog에서 accept 오류가 발생했습니까?
void serve (int sockfd)
{
int ret;
int clfd;
int status;
FILE *fp;
pid_t pid;
char buf[BUFLEN];
for (;;) {
clfd = accept (sockfd, NULL, NULL);
if (clfd < 0) {
syslog (LOG_ERR, "accept error: %d, %s", errno, strerror (errno));
//if (errno == EOPNOTSUPP)
//{
// syslog (LOG_INFO, "retry..");
// continue;
//}
exit (1);
}
fp = popen ("/usr/bin/uptime", "r");
if (fp == NULL) {
sprintf (buf, "error: %s
", strerror (errno));
ret = send (clfd, buf, strlen (buf), 0);
syslog (LOG_ERR, "write back %d for error", ret);
} else {
while (fgets (buf, BUFLEN, fp) != NULL)
{
ret = send (clfd, buf, strlen (buf), 0);
// very amazing, add these log will lead to accept failed with EOPNOTSUPP (95)
// maybe syslog used dgram socket confuse us..
syslog (LOG_ERR, "write back %d", ret);
}
pclose (fp);
}
close (clfd);
}
}
accept가 연결clfd를 성공적으로 되돌린 후에 이 serve 방법을 사용하여 클라이언트의 요청을 서비스합니다. 간단하게 말하자면popen을 통해 uptime 명령을 시작하여 현재 시스템이 실행된 시간을 되돌려주고 uptime의 출력을 clfd로 내보내서 클라이언트에게 되돌려줍니다.
정상적인 출력은 다음과 같습니다.
[yunhai@localhost 16.chapter]$ ./uptime_tcp_clt
connect ok
02:02:26 up 6 days, 4:40, 5 users, load average: 0.00, 0.00, 0.00
그러나 책의 예와 달리 서비스 측의 활동 상황을 보기 위해 서비스에syslog 출력을 몇 마디 추가해서tail-f/var/log/messages를 통해 서비스가 실행되는 상황을 볼 수 있도록 했습니다.
정상적인 서비스 출력은 다음과 같습니다.
ruptimed: write back 70
하지만 신기한 일이 일어났습니다. 클라이언트를 다시 시작한 후 서버를 연결할 수 없습니다.
[yunhai@localhost 16.chapter]$ ./uptime_tcp_clt
connect failed, retry...
connect failed, retry...
connect failed, retry...
서버 프로세스를 다시 보니 종료되었습니다. 데몬 로그를 보러 왔습니다.
ruptimed: accept error: 95, Operation not supported
원래accept 오류로 서버가 종료되었습니다. 오류 코드는 95입니다
. 만약에 내가 추가한syslog를 주석하면 모든 것이 정상이기 때문에syslog와syslogd 프로세스를 사용하여 UDP 통신 전송 로그를 진행할 때 accept를 방해하여 후자를 실패시켰다고 의심합니다.
그러나 이 과정이 구체적으로 어떤지는 아직 알 수 없다. 내가 사용하는 포트가 4201이라는 것만 알고 다른 포트로 바꾸는 것도 마찬가지다.
나는 실패한 후에accept 작업을 다시 시작하려고 시도했지만, 결과는 무한한 순환에 빠졌고, 매번 같은 오류를 겪었다.
서버 코드
클라이언트 코드
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.