아이고 형님들 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 태그로 깔끔하게 정리해주시고, 주석으로 정리라도 해주셔야 사람들이 분석해줄겁니다...
뭐가 문제라는 언급도 없군요.
뭐가 문제라는 언급도 없군요.
댓글 달기