diff --git a/StringSocket/client.c b/StringSocket/client.c index f3a950c280a1becc162f5d95d8e3b2ecc3d639d2..355913910a6dbac401fa21036fc86106565ac67b 100644 --- a/StringSocket/client.c +++ b/StringSocket/client.c @@ -1,5 +1,6 @@ /* * client.c * + * server에게 string을 전송하는 코드. * Created on: 2018. 5. 9. * Author: minseo */ @@ -14,18 +15,18 @@ #include #include -#define BUFSIZE 1024 +#define BUFSIZE 1000 void main() { int socket_fd; int data_size; int send_size; - int all_size = 0; int receive_len; int i; + int pointer_location; struct sockaddr_in server_addr; char data_buf[1000000]; - char* data; + char* data = NULL; char send_buf[BUFSIZE] = { '\0', }; char receive_buf[BUFSIZE] = { '\0', }; int snd_buf; @@ -43,7 +44,7 @@ void main() { memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; - server_addr.sin_addr.s_addr = inet_addr("192.168.56.103"); + server_addr.sin_addr.s_addr = inet_addr("192.168.56.101"); server_addr.sin_port = htons(50000); if (connect(socket_fd, (struct sockaddr*) &server_addr, sizeof(server_addr)) @@ -54,15 +55,18 @@ void main() { //strcpy(send_buf, "happy birthday"); - for (i = 0; i < 1000; i++) { - strcat(data_buf, "abcdefghijklmnopqrstuvwxyz"); +// printf("insert data: "); +// scanf("%s \n", &data_buf); + + for (i = 0; i < 10235; i++) { + strncat(data_buf, "hellowabc", 9); } data = (char *) malloc(sizeof(strlen(data_buf) + 1)); data = data_buf; // printf("%s \n", data); - // 1. data size를 전달. +// 1. server에 data size를 전달. data_size = strlen(data); sprintf(send_buf, "%d", data_size); @@ -70,37 +74,39 @@ void main() { exit(1); } - // 2. size가 잘 도착했는지 확인. + // 2. server로 보낸 data size가 잘 도착했는지 확인. if ((receive_len = recv(socket_fd, receive_buf, BUFSIZE - 1, 0)) == -1) { exit(1); } - // 3. data size와 보낸 data size를 확인. size가 일치하지 않으면 exit! + // 3. client data size와 server data size를 확인. size가 일치하지 않으면 exit! if (data_size != atoi(receive_buf)) { printf("data size error. \n"); exit(1); } - printf("%d \n", atoi(receive_buf)); - -// printf("%s \n", send_buf); + // printf("%s \n", send_buf); - i = 1; - // 4. size가 일치하면 데이터 전달. + pointer_location = 0; + // 4. server와 client의 data size가 일치하면 data 전달. while (1) { - if ((send_size = send(socket_fd, &data + i, BUFSIZE, 0)) != BUFSIZE) { - exit(1); - } - i++; - data_size -= 1024; - if (data_size < 1024) { - if ((send_size = send(socket_fd, &data + i, data_size, 0)) != data_size) { + // 전달 할 data_size가 1024보다 작으면 그 크기만큼 전달한다. + if (data_size < BUFSIZE) { + if ((send_size = send(socket_fd, data + pointer_location, data_size, 0)) != data_size) { exit(1); } + printf("%d \n", send_size); break; } - } + if ((send_size = send(socket_fd, data + pointer_location, BUFSIZE, 0)) != BUFSIZE) { + exit(1); + } + pointer_location += BUFSIZE; + // 전체 data_size에서 보낸 size(=1024)만큼 빼준다. + printf("%d \n", send_size); + data_size -= BUFSIZE; + } + printf("total_len: %d \n", atoi(receive_buf)); close(socket_fd); - } diff --git a/StringSocket/server.c b/StringSocket/server.c index ec9451d1e7e8f5edff04c24cdb21a24ef995424d..ad39ab00c9797ea073b020dd05aab0969f7976fa 100644 --- a/StringSocket/server.c +++ b/StringSocket/server.c @@ -16,7 +16,7 @@ #include #include -#define BUFSIZE 1024 +#define BUFSIZE 1001 void main() { int server_fd; @@ -25,7 +25,7 @@ void main() { int client_len; int receive_len; int data_size; - int recv_size; + int total_receive_len; struct sockaddr_in server_addr; struct sockaddr_in client_addr; char send_buf[BUFSIZE] = {'\0',}; @@ -68,8 +68,8 @@ void main() { exit(1); } - // 1. data size를 전달 받음. - if ((receive_len = recv(client_fd, receive_buf, BUFSIZE - 1, 0)) == -1) { + // 1. client로부터 data size를 전달 받음. + if ((receive_len = recv(client_fd, receive_buf, BUFSIZE, 0)) == -1) { exit(1); } @@ -79,30 +79,34 @@ void main() { printf("%d \n", data_size); - // 2. 받은 data size를 전달함. + // 2. client 받은 data size를 전달함. if (send(client_fd, receive_buf, strlen(receive_buf), 0) != strlen(receive_buf)) { exit(1); } // 요청을 받아들인 하나의 client에 대해서 반복. while(1) { - if ((receive_len = recv(client_fd, receive_buf, BUFSIZE, 0)) == -1) { + memset(receive_buf, 0, BUFSIZE); + + //3. client로 부터 data를 전달 받음. + if ((receive_len = recv(client_fd, receive_buf, BUFSIZE - 1, 0)) == -1) { perror("receive error"); exit(1); } - printf("%d \n", receive_len); - recv_size += receive_len; + total_receive_len += receive_len; + // 4. 더이상 client로부터 받는 data가 없으면 해당 client와 연결 종료. if(receive_len == 0) { + printf("total_len: %d \n", total_receive_len); + total_receive_len = 0; + memset(receive_buf, 0, BUFSIZE); break; } - data_size = atoi(receive_buf); - + printf("%d \n", receive_len); printf("Receive data: %s \n", receive_buf); } - printf("len: %d \n", recv_size); + close(client_fd); } - close(client_fd); }