아이고 형님들 bind 에러좀 고쳐주십쇼
 11 #include 
 12 #include 
 13 #include 
 14 #include 
 15 #include 
 16 #include 
 17 #include 
 18 #include 
 19 
 20 #define BUF_SIZE 30
 21 
 22 void error_handling(char* message);
 23 void read_childproc(int sig);
 24 
 25 int main(int argc, char** argv)
 26 {
 27     int option=1;
 28     int optlen;
 29 
 30     int fds1[2], fds2[2];
 31     socklen_t clnt_adr_sz;
 32     int serv_sock, clnt_sock; //socket용 accept용 
 33     char buf[BUF_SIZE]; //메제시 저장변수 
 34     pid_t pid;
 35     struct sockaddr_in serv_adr, clnt_adr;
 36     struct sigaction act; //시그널 구조체 
 37     int str_len, state;
 38     pipe(fds1);
 39     pipe(fds2);
 40 
 41     if(argc != 2)
 42     {
 43         printf("Usage: %s \n",argv[0]);
 44         exit(0);
 45     }
 46     act.sa_handler = read_childproc;
 47     sigemptyset(&act.sa_mask);
 48     act.sa_flags = 0;
 49 
 50     state = sigaction(SIGCHLD, &act, 0);
 51 
 52     serv_sock = socket(PF_INET, SOCK_STREAM, 0);
 53 
 54     option = 1;
 55     setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, (void*)&option, sizeof(option));
 56 
 57     memset(&serv_adr, 0, sizeof(serv_adr));
 58     serv_adr.sin_family = AF_INET;
 59     serv_adr.sin_addr.s_addr = htonl(INADDR_ANY); //나중에 ip주소 바꿔야겠다. ㅋ 
 60     serv_adr.sin_port = htons(atoi(argv[1]));
 61 
 62     if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == -1)
 63         error_handling("bind() error");
 64     if(listen(serv_sock, 2) == -1)
 65         error_handling("listen() error");
 66     //setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, (void*)&option, sizeof(option));
 67 
 68     int i;
 69     //그냥 한개는 accept하고 생성된 다음 부모프로세스엑서 accept준비해야겠디. 
 70     clnt_adr_sz = sizeof(clnt_adr);
 71     clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
 72     if(clnt_sock == -1)
 73         error_handling("accept() error");
 74     else
 75         printf("Client connected!\n");
 76 //
 77     pid = fork();
 78 
 79     if(pid == -1)
 80     {
 81         error_handling("suspicious fork()");
 82     }
 83     if(pid == 0) //클라이언트1의 실행구간 
 84     {
 85         char recv_buf[BUF_SIZE];
 86         char send_buf[BUF_SIZE]; //프로세스 2개 만들어서 한개는 클라이언트의 데이터를 받는 프로세스 한개는 서버간의 프로세스를 통신할 프로세스
 87         close(serv_sock); //복사되었으니 지웡
 88         //read(fds1[0], recv_buf, BUF_SIZE); //수신할때 서버의 다른프로세스가 주는 데이터랑 클라이언트가 주는 데이터가 있네 ;; 음 .. 이것도 프로세슬르 만들어서 해야하나   
 89 
 90         pid = fork();
 91 
 92         if(pid == 0) //서버관의 통신 
 93         {
 94             //close(clnt_sock); 
 95             read(fds1[0], recv_buf, BUF_SIZE);
 96             write(clnt_sock, recv_buf, BUF_SIZE);
 97         }
 98         else{ //클라이언트와의 통신
 99             while((str_len = read(clnt_sock, send_buf, BUF_SIZE)) !=0)
100             {
101                 write(fds2[1], send_buf,BUF_SIZE);
102             }
103             puts("Client disconnected!");
104             close(clnt_sock);
105             return 0;
106         }
107     }
108 
109     else
110     { //나중에 여기 while문 넣어보자 접속이 끊어지고 다른 클라이언트가 접속할수 있게 ㅋ 
111         close(clnt_sock);
112         clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz); //접속할 때 까지 bloking상태 //클라이언트가 이름을 쓸 수 있게 해야지 
113         //클라이언트 작성할 때 writev랑 readv 써서 클라이언트의 이름을 같이 보낼 수도 이름을 분리할 수 있게 만들자! 
114         if(clnt_sock == -1)
115         {
116             error_handling("accept() error");
117         }
118         else
119         {
120             printf("Client connected!\n");
121         }
122         pid = fork();
123         if(pid == -1)
124         {
125             error_handling("suspicious fork()");
126         }
127         if(pid == 0) //클라이언트2의 실행구간 
128         {
129             close(serv_sock);
130             char recv_buf[BUF_SIZE];
131             char send_buf[BUF_SIZE];
132 
133             pid = fork();
134             if( pid == 0) //server 
135             {
136             //  close(clnt_sock); 
137                 read(fds2[0], recv_buf, BUF_SIZE); //umm... 
138                 write(clnt_sock, recv_buf, BUF_SIZE);
139             }
140             else{
141                 while((str_len = read(clnt_sock, send_buf, BUF_SIZE)) != 0)
142                 {
143                     write(fds1[0], send_buf, BUF_SIZE);
144                 }
145                 close(clnt_sock);
146                 puts("Client disconnected!");
147                 return 0;
148             }
149         }
150         else{
151             close(clnt_sock);
152         }
153     }
154     close(serv_sock);
155     return 0;
156 }
157 
158 void error_handling(char* message)
159 {
160     fputs(message, stderr);
161     fputc('\n',stderr);
162     exit(1);
163 }
164 void read_childproc(int sig)
165 {
166     pid_t pid;
167     int status;
168     id = waitpid(-1,&status,WNOHANG);
169     printf("remove proc id : %d\n",pid);
170 }


질문을 잘 해야 답도 잘 나오겠죠?
질문을 잘 해야 답도 잘 나오겠죠?
https://wiki.kldp.org/wiki.php/DocbookSgml/Beginner_QA-KLDP#AEN70
세벌 https://sebuls.blogspot.kr/
이거 코드를 그냥 복사 붙여넣기 해놓으시면 사람들이
이거 코드를 그냥 복사 붙여넣기 해놓으시면 사람들이 분석 안할겁니다....
하다못해 code 태그로 깔끔하게 정리해주시고, 주석으로 정리라도 해주셔야 사람들이 분석해줄겁니다...
뭐가 문제라는 언급도 없군요.
뭐가 문제라는 언급도 없군요.
댓글 달기