blocking 소켓 non-blocking 소켓으로의 변환
글쓴이: sacredone / 작성시간: 목, 2012/10/11 - 4:53오후
블로킹을 넌블로킹으로 변환할때의 방법을 찾아보니까
fcntl() 함수를 사용하라는 글이있었고
ioctlsocket() 함수를 호출해야만 가능하다는 글도있고
헷갈리네요;;
게다가 소켓을 어떻게 변환했다쳐도
read/write, recv/send 등의 함수사용에도
(특히 recv/send) 인자값에 변화가 있을거같은데
지식좀 나눠주실수 있으신분 계실까요 ㅠ
먼저 제가짠 단순한 코드점 올려볼게요
먼저 서버프로그램
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <arpa/inet.h>
6 #include <sys/types.h>
7 #include <sys/socket.h>
8
9 #define BUFF_SIZE 1024
10
11 int main(int argc, char **argv)
12 {
13 int client_addr_size;
14 int client_socket;
15 int server_socket;
16 int flag;
17 struct sockaddr_in client_addr;
18 struct sockaddr_in server_addr;
19 char recv_buffer[BUFF_SIZE];
20 char send_buffer[BUFF_SIZE];
21
22 memset(&server_addr, 0, sizeof(server_addr));
23
24 server_socket = socket(PF_INET, SOCK_STREAM, 0);
25 if (server_socket == -1){
26 perror("failed to make socket");
27 return -1;
28 }
29
30 server_addr.sin_family = AF_INET;
31 server_addr.sin_port = htons(4000);
32 server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
33
34 if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1){
35 perror("failed to bind");
36 return -1;
37 }
38
39 if (listen(server_socket, 5) == -1){
40 perror("failed to listen");
41 return -1;
42 }
43
44 while (1){
45 memset(recv_buffer, 0, BUFF_SIZE);
46
47 client_addr_size = sizeof(client_addr);
48 client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_size);
49 if (client_socket == -1){
50 perror("failed to accept");
51 return -1;
52 }
53 recv(client_socket, recv_buffer, BUFF_SIZE, 0);
54 printf("%s\n", recv_buffer);
55
56 send(client_socket, recv_buffer, strlen(recv_buffer), 0);
57 }
58 }이건 클라이언트 프로그램
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <arpa/inet.h>
6 #include <sys/types.h>
7 #include <stdlib.h>
8 #include <stdlib.h>
9 #include <sys/socket.h>
10
11 #define BUFFER_SIZE 1024
12
13 int main(int argc, char **argv)
14 {
15 int client_socket;
16 struct sockaddr_in server_addr;
17 FILE *input_fp;
18 char recv_buffer[BUFFER_SIZE];
19 char *send_buffer;
20 size_t recv_len;
21 ssize_t recv_size;
22
23 send_buffer = NULL;
24 recv_len = 0;
25 memset(recv_buffer, 0, BUFFER_SIZE);
26
27 input_fp = fopen(argv[1], "r");
28 if (input_fp == NULL){
29 perror("failed to open file");
30 return -1;
31 }
32
33 client_socket = socket(PF_INET, SOCK_STREAM, 0);
34 if (client_socket == -1){
35 perror("failed to make socket");
36 return -1;
37 }
38
39 server_addr.sin_family = AF_INET;
40 server_addr.sin_port = htons(4000);
41 server_addr.sin_addr.s_addr = inet_addr("10.1.1.150");
42
43 if ((connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr))) == -1){
44 perror("failed to connect");
45 return -1;
46 }
47
48 recv_size = getline(&send_buffer, &recv_len, input_fp);
49 send(client_socket, send_buffer, strlen(send_buffer), 0);
50
51 recv(client_socket, recv_buffer, BUFFER_SIZE, 0);
52 printf("%s\n", recv_buffer);
53
54 if (send_buffer != NULL){
55 free(send_buffer);
56 }
57 fclose(input_fp);
58 close(client_socket);
59
60 return 0;
61 }기능은 매우 단순하게
클라이언트 프로그램을 텍스트 파일명을 인자로 줘서 실행하면
그 파일의 한줄을 읽고 서버로 전송하고 다시 클라가 받는 에코서버클라 플로그램입니다
이걸 최대한 안바꾸고 non-blocking 으로 바꿔서
변화되는것들을 좀 공부하고싶은데
도움좀 부탁드려볼게요
Forums:


댓글 달기