[apue] syslog에서 accept 오류가 발생했습니까?

5374 단어
며칠 전에 apue 16장에서 socket에 대한 예를 봤는데 아주 전형적인 socket 서버입니다. 관건적인 코드는 다음과 같습니다.
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입니다EOPNOTSUPP .
만약에 내가 추가한syslog를 주석하면 모든 것이 정상이기 때문에syslog와syslogd 프로세스를 사용하여 UDP 통신 전송 로그를 진행할 때 accept를 방해하여 후자를 실패시켰다고 의심합니다.
그러나 이 과정이 구체적으로 어떤지는 아직 알 수 없다. 내가 사용하는 포트가 4201이라는 것만 알고 다른 포트로 바꾸는 것도 마찬가지다.
나는 실패한 후에accept 작업을 다시 시작하려고 시도했지만, 결과는 무한한 순환에 빠졌고, 매번 같은 오류를 겪었다.
 
서버 코드
클라이언트 코드

좋은 웹페이지 즐겨찾기