FREEDOM. FRIENDS. FEATURES. FIRST.
페도라 한국 사용자 모임

리눅스 소켓프로그래밍중인데 컴파일이안됩니다

게시판 질문게시판 리눅스 소켓프로그래밍중인데 컴파일이안됩니다

  • This topic has 5개 답변, 2명 참여, and was last updated 6 years, 7 months 전에 by 과자도둑. This post has been viewed 29 times
  • 만든이
    게시글
  • #13569
    과자도둑
    참가자
    • 게시글5
    • 댓글4
    • 총합9
    • ★★
    @kjyong98

    리눅스에서 서버쪽 소켓프로그래밍중인데

    컴파일하면 에러는안뜨는데 작동을안합니다.

    즉 메인함수의 테스트출력 print문조차도 출력이안되요.

    대체 어디가 문제인걸까요?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>

    #define BUF_SIZE 1024
    void error_handling(char *message);

    int main()
    {

        printf("작동 테스트");

        int serv_sock, clnt_sock;
        char message[BUF_SIZE];
        int str_len, i;

        struct sockaddr_in serv_adr;
        struct sockaddr_in clnt_adr;
        socklen_t clnt_adr_sz;

        int port = 5000;    // 서버 포트번호

        // 소켓 생성
        serv_sock=socket(PF_INET, SOCK_STREAM, 0);
        if(serv_sock==-1)
            error_handling("socket() error");

        memset(&serv_adr, 0, sizeof(serv_adr));
        serv_adr.sin_family=AF_INET;
        serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
        serv_adr.sin_port=htons(port);

        if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1)
            error_handling("bind() error");

        if(listen(serv_sock, 5)==-1)
            error_handling("listen() error");

        clnt_adr_sz=sizeof(clnt_adr);

        printf("클라이언트의 접속을 기다리는중...");

        for(i=0; i<5; i++)
        {
            clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
            if(clnt_sock==-1)
                error_handling("accept() error");
            else
                printf("Connected client %d \n", i+1);        // 클라이언트 접속 알림

            while((str_len=read(clnt_sock, message, BUF_SIZE))!=0)
            {
                printf("클라이언트로부터 받은 메시지 : %s\n", message);
            }

            close(clnt_sock);
        }

        close(serv_sock);
        return 0;
    }

    void error_handling(char *message)
    {
        fputs(message, stderr);
        fputc('\n', stderr);
        exit(1);
    }

4 답변 글타래를 보이고 있습니다
  • 글쓴이
    답변
    • #15298
      난해주님
      참가자
      • 게시글114
      • 댓글337
      • 총합451
      • ★★
      @workman729

      컴파일이 안되는 것인가요? 아니면 소스 상의 문제에 대한 것인가요?

      제목과 글 내용이 다르니 추측하기가 뭐하지만 소스 상에 문제가 있는 것 같습니다.
      아래 링크를 참조 하시기 바랍니다.

      http://forum.falinux.com/zbxe/index.php?document_srl=429387&mid=C_LIB&listStyle=list&sort_index=readed_count&order_type=desc

    • #15299
      과자도둑
      참가자
      참가자
      • 게시글5
      • 댓글4
      • 총합9
      • ★★
      @kjyong98

      gcc로 컴파일하면 에러없이 잘되긴하는데

      실행파일을 실행시키면 아무것도 안나옵니다.

      적어주신 링크의 예제소스를 그대로 써봐도 똑같아요

      컴파일러문제인가싶어서 그냥 간단히 문자열 출력해주는 프로그램을 만들어보니

      잘됩니다. 뭐가문제일까요...

    • #15300
      과자도둑
      참가자
      참가자
      • 게시글5
      • 댓글4
      • 총합9
      • ★★
      @kjyong98

      프로그래밍중 이상한점을 발견했습니다.

      제 소스에서

         if(serv_sock==-1)
              error_handling("socket() error");

      이부분을

         if(serv_sock!=-1)
              error_handling("소켓 생성");

      이런식으로 바꾸고 실행시켜보니

      이건또 출력이되네요.

      근데 여기서 이상한점은 저거이외에

      printf문들은 출력이안됩니다. 예를들어

      맨위에 있는 printf("작동 테스트"); 같은것들이요.

    • #15301
      난해주님
      참가자
      • 게시글114
      • 댓글337
      • 총합451
      • ★★
      @workman729

      일단 저는 전공이 다른 쪽임을 먼저 말씀 드리고 그냥 소스 상의 문제를 예측한 것에 불과하오니
      저의 답변이 틀렸을 수도 있음을 사전에 말씀 드립니다.

      #include <sys/types.h>

      int main(void) 로 하셔야 되지 않나요?

      수정 하신 뒤 해보시겠습니까? 그리고  SOCK_STREAM 사용시 tcp 인지 udp인지 정의해 주어야 하는 데 SOCK_STREAM는 tcp이므로 당연히 #include <sys/types.h>가 필요할 것 입니다.

      수정 부분에서 -1을 반환하면 연결 실패를 뜻하고 이외는 소켓 식별자 이므로 둘 다 나와야 하는데 하나는 되고 하나는 되지 않다고 하니 조금 이상하군요!

      저보다 고수님께서 답변 해주셔야 할 것 같습니다.

    • #15302
      과자도둑
      참가자
      참가자
      • 게시글5
      • 댓글4
      • 총합9
      • ★★
      @kjyong98

      위에 제가 수정한부분을 잘못보신거같은데

      출력이 되나 확인해보기위해서

      -1을 반환했을때가아니라 반환을 안했을때로 바꾼겁니다.

      그래서 출력이 된거구요 ㅎㅎ

      그래도 정말 많은 도움이 되었습니다.

      감사합니다.

4 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.