서버의 accept () 함수가 클라이언트의 새 연결을 수락하지 않는 것 같습니다.

Dhayalan Pro

나는 소켓 네트워킹 API 인 UNIX Network Programming 의 코드를 시도하고 있었는데 여기서 간단한 서버 클라이언트와 서버 기반 예제에 대한 코드를 발견했습니다.

서버 코드는

#define BL 10

void *get_in_addr(struct sockaddr *sa)
{
  if (sa->sa_family == AF_INET)
  {
    return &(((struct sockaddr_in*) sa)->sin_addr);
  }
  return &(((struct sockaddr_in6*) sa)->sin6_addr);
}

int main(int argc, char ** argv)
{
  struct sockaddr_in server, client;
  int listenfd;
  int port;

  if (argc < 2)
  {
    printf("Port Not specified Error ~~ ! ");
    exit(0);
  }

  port = atoi(argv[1]);
  memset(&server, 0, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_addr.s_addr = htons(INADDR_ANY);
  server.sin_port = htons(port);

  listenfd = socket(AF_INET, SOCK_STREAM, 0);

  if (bind(listenfd, (struct sockaddr *) &server, sizeof(server)) == 0)
    printf("\n [~] Bind Sucessfull \n");

  if (listen(listenfd, BL) == 0)
    printf("\n [~] Listenig on port %d \n\n ", port);

  while (1)
  {
    socklen_t clientlen = sizeof(client);
    printf("%d", clientlen);
    int conffd = accept(listenfd, (struct sockaddr *) &client, &clientlen);
    char s[INET6_ADDRSTRLEN];
    inet_ntop(AF_INET, get_in_addr((struct sockaddr *) &client), s, sizeof(s));
    if (conffd == -1)
      printf("\n not Accepted \n");
    else
    {
      printf("Got a connection from %s", s);
    }
  }

  return 0;
}

클라이언트에 대한 코드는

int main(int argc, char ** argv)
{

  struct sockaddr_in server;
  int listenfd;
  int port = 11111;
  memset(&server, 0, sizeof(server));
  inet_pton(AF_INET, argv[1], &server.sin_addr);
  server.sin_family = AF_INET;
  server.sin_port = htons(port);

  listenfd = socket(AF_INET, SOCK_STREAM, 0);
  if (connect(listenfd, (struct sockaddr *) &server, sizeof(server)) != 0)
  {
    printf("Connection error ! \n");
  }

  return 0;
}

여기서 문제는 서버를 시작하고 클라이언트를 실행할 때 서버에서 아무 일도 일어나지 않지만 "#IP에서 연결됨"이라고 표시됩니다.

출력은 다음과 같습니다.

./server 11111

[~] Bind Sucessfull 

[~] Listenig on port 11111 

출력되어야합니다.

./server 11111

[~] Bind Sucessfull 

[~] Listenig on port 11111 

Got an connection from 127.0.0.1

그래서 고객에게 문제가 있다고 생각했습니다.

그래서 확인하고 서버를 닫고 클라이언트를 다시 실행했는데 이제 연결 오류가 발생했습니다.

즉, 클라이언트가 제대로 작동하고 있으므로 문제는 서버의 accept ()

문제의 원인을 찾을 수없는 것 같습니다.

누군가가 무엇이 잘못되었는지 설명 할 수 있다면 정말 도움이 될 것입니다. :)

Sourav Ghosh

위의 주석에 대한 후속 조치로 표준 출력 stdout라인 버퍼링 이라는 것을 알아야합니다. 즉, newline 만 만날 때만 버퍼의 내용을 출력 화면으로 보냅니다 \n. 따라서 인쇄 문자열에 개행 문자가있을 때까지 [또는 수동으로 버퍼를 플러시하는 경우 fflush(stdout)] 버퍼의 내용이 화면에 플러시되지 않습니다.

코드에서 성공 accept()하면 printf()이 호출되고와 함께 제공된 문자열이와 printf()관련된 버퍼로 전송 stdout되지만 내용은 화면으로 플러시 되지 않습니다 . 제어가 계속되고 다음 호출 에서 차단 된 상태가됩니다 accept(). 따라서 출력 버퍼는 귀하의 경우 화면에 플러시 될 기회를 얻지 못합니다.

인쇄 문자열에 개행 문자 [\ n]를 추가하십시오. 버퍼의 내용이 즉시 플러시되고 화면에서 출력을 볼 수 있습니다.

 printf("Got a connection from %s\n", s);

참고 : [출력 버퍼에 콘텐츠가 있는지 확인하기위한 것입니다.] 우리가 알고 있듯이 프로그램 종료로 인해 관련된 모든 버퍼가 플러시됩니다. 서버 실행을 수동으로 종료 할 수 있습니다. [아마도 crtl + c를 눌러서] 화면에서 인쇄 명세서를 볼 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

서버가 새 연결을 수락하지 않고 백 로그 크기가 0 인 경우에도 Python 클라이언트 소켓이 연결됩니다.

분류에서Dev

서버가 클라이언트 메시지를 수신하지 않는 것 같습니다 ANDROID

분류에서Dev

SSH 클라이언트가 원격 서버의 ECDSA 키를 확인할 때 'known_hosts'파일 대신 '/ dev / null'을 확인하는 것 같습니다.

분류에서Dev

R의 복잡한 문자열에서 여러 새 열을 추출하는 방법 (str_sub가 트릭을 수행하지 않는 것 같습니다)

분류에서Dev

서버가 파일에서 데이터를 읽기 위해 클라이언트 측에서 연결을 수락하지 않습니다.

분류에서Dev

서버가 파일에서 데이터를 읽기 위해 클라이언트 측에서 연결을 수락하지 않습니다.

분류에서Dev

C #의 TCP 클라이언트 서버, 아무것도 표시하지 않고 연결 중입니다.

분류에서Dev

Samba 클라이언트는 서버에서 인터넷 연결없이 새 연결을 설정할 수 없습니다.

분류에서Dev

jQuery의 data () 함수가 제대로 작동하지 않는 것 같습니다.

분류에서Dev

동일한 컴퓨터의 OpenVPN 클라이언트와 서버-서버는 클라이언트가 연결되어있을 때 연결을 허용하지 않습니다.

분류에서Dev

다중 클라이언트 – 서버 – 모든 새 클라이언트가 변수의 현재 값을 어떻게 볼 수 있습니까?

분류에서Dev

/ bin / bash가 Virtualbox 클라이언트에서 작동하지 않는 것 같습니다.

분류에서Dev

동일한 컴퓨터의 OpenVPN 클라이언트 및 서버-클라이언트가 연결되어있을 때 서버에서 연결을 허용하지 않습니다.

분류에서Dev

여러 서브넷의 클라이언트는 동시에 서버에 연결할 수 없습니다.

분류에서Dev

여러 서브넷의 클라이언트는 동시에 서버에 연결할 수 없습니다.

분류에서Dev

Java ServerSocket accept 메소드가 클라이언트의 한 연결 요청에 대해 소켓을 두 번 반환하는 이유는 무엇입니까?

분류에서Dev

CSJS XSP.partialRefreshGet이 새로 고침을 수행하지 않는 것 같습니다.

분류에서Dev

Python 서버는 연결된 첫 번째 클라이언트뿐만 아니라 연결된 모든 클라이언트에서 수신을 얻습니다.

분류에서Dev

OpenVPN-새 서브넷의 클라이언트에 연결할 수 없습니다.

분류에서Dev

macOS Sierra의 PF가 ApplicationFirewall을 읽지 않는 것 같습니다.

분류에서Dev

swisnl의 jQuery ContextMenu에서 라디오 버튼 그룹 클릭 이벤트를 얻는 방법을 얻을 수없는 것 같습니다.

분류에서Dev

Free Pascal 경고 "관리 유형의 함수 결과 변수가 초기화되지 않은 것 같습니다."

분류에서Dev

Mythmote가 mythbuntu 12.04에 연결되지 않고 프런트 엔드가 모든 인터페이스에서 수신하지 않는 것 같습니다.

분류에서Dev

Meteor : 콘솔 (서버)에서 볼 수 있으며 정의되지 않은 것을 클라이언트로 보냅니다.

분류에서Dev

Mqtt 클라이언트가 다른 클라이언트의 연결 여부를 알 수있는 방법

분류에서Dev

배치 : 루프에서 whois 명령을 수행하는 것이 작동하지 않는 것 같습니다.

분류에서Dev

누군가 내 서버 / 클라이언트가 연결을 설정하는 방식으로 작동하지 않는 이유를 설명 할 수 있습니까?

분류에서Dev

Spring Cloud Config : 클라이언트가 구성 서버에 연결을 시도하지 않습니다.

분류에서Dev

서버의 데이터로 Observable을 채우는 것을 파악할 수없는 것 같습니다.

Related 관련 기사

  1. 1

    서버가 새 연결을 수락하지 않고 백 로그 크기가 0 인 경우에도 Python 클라이언트 소켓이 연결됩니다.

  2. 2

    서버가 클라이언트 메시지를 수신하지 않는 것 같습니다 ANDROID

  3. 3

    SSH 클라이언트가 원격 서버의 ECDSA 키를 확인할 때 'known_hosts'파일 대신 '/ dev / null'을 확인하는 것 같습니다.

  4. 4

    R의 복잡한 문자열에서 여러 새 열을 추출하는 방법 (str_sub가 트릭을 수행하지 않는 것 같습니다)

  5. 5

    서버가 파일에서 데이터를 읽기 위해 클라이언트 측에서 연결을 수락하지 않습니다.

  6. 6

    서버가 파일에서 데이터를 읽기 위해 클라이언트 측에서 연결을 수락하지 않습니다.

  7. 7

    C #의 TCP 클라이언트 서버, 아무것도 표시하지 않고 연결 중입니다.

  8. 8

    Samba 클라이언트는 서버에서 인터넷 연결없이 새 연결을 설정할 수 없습니다.

  9. 9

    jQuery의 data () 함수가 제대로 작동하지 않는 것 같습니다.

  10. 10

    동일한 컴퓨터의 OpenVPN 클라이언트와 서버-서버는 클라이언트가 연결되어있을 때 연결을 허용하지 않습니다.

  11. 11

    다중 클라이언트 – 서버 – 모든 새 클라이언트가 변수의 현재 값을 어떻게 볼 수 있습니까?

  12. 12

    / bin / bash가 Virtualbox 클라이언트에서 작동하지 않는 것 같습니다.

  13. 13

    동일한 컴퓨터의 OpenVPN 클라이언트 및 서버-클라이언트가 연결되어있을 때 서버에서 연결을 허용하지 않습니다.

  14. 14

    여러 서브넷의 클라이언트는 동시에 서버에 연결할 수 없습니다.

  15. 15

    여러 서브넷의 클라이언트는 동시에 서버에 연결할 수 없습니다.

  16. 16

    Java ServerSocket accept 메소드가 클라이언트의 한 연결 요청에 대해 소켓을 두 번 반환하는 이유는 무엇입니까?

  17. 17

    CSJS XSP.partialRefreshGet이 새로 고침을 수행하지 않는 것 같습니다.

  18. 18

    Python 서버는 연결된 첫 번째 클라이언트뿐만 아니라 연결된 모든 클라이언트에서 수신을 얻습니다.

  19. 19

    OpenVPN-새 서브넷의 클라이언트에 연결할 수 없습니다.

  20. 20

    macOS Sierra의 PF가 ApplicationFirewall을 읽지 않는 것 같습니다.

  21. 21

    swisnl의 jQuery ContextMenu에서 라디오 버튼 그룹 클릭 이벤트를 얻는 방법을 얻을 수없는 것 같습니다.

  22. 22

    Free Pascal 경고 "관리 유형의 함수 결과 변수가 초기화되지 않은 것 같습니다."

  23. 23

    Mythmote가 mythbuntu 12.04에 연결되지 않고 프런트 엔드가 모든 인터페이스에서 수신하지 않는 것 같습니다.

  24. 24

    Meteor : 콘솔 (서버)에서 볼 수 있으며 정의되지 않은 것을 클라이언트로 보냅니다.

  25. 25

    Mqtt 클라이언트가 다른 클라이언트의 연결 여부를 알 수있는 방법

  26. 26

    배치 : 루프에서 whois 명령을 수행하는 것이 작동하지 않는 것 같습니다.

  27. 27

    누군가 내 서버 / 클라이언트가 연결을 설정하는 방식으로 작동하지 않는 이유를 설명 할 수 있습니까?

  28. 28

    Spring Cloud Config : 클라이언트가 구성 서버에 연결을 시도하지 않습니다.

  29. 29

    서버의 데이터로 Observable을 채우는 것을 파악할 수없는 것 같습니다.

뜨겁다태그

보관