반응형
- 본 내용은 Linux (Ubuntu 14.04 lts)를 기반으로 제작되었습니다. -
소캣 프로그래밍은 TCP/IP 기반으로 하였습니다.
이전 게시물의 내용을 기반으로
서버에서 클라이언트로 메세지를 전송하는 코드를 제작 해 본다.
< header.h >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //header.h #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <fcntl.h> #include <unistd.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #define PORT 10000 #define BUFFER_LEN 100 #define CHAT_SIZE 1024 #define BUFF_SIZE 1024 #define LISTEN_QUEUE_SIZE 5 // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
< server.c >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | //server.c # include "header.h" int main(int argc, char *argv[]) { //서버의 listen 소켓 데이터 구조 생성과정 char buffer[BUFFER_LEN]; struct sockaddr_in server_addr, client_addr; char temp[20]; char chat_data[CHAT_SIZE]; int server_fd, client_fd; int len, msg_size; char test[20]; char Quit[5] = "quit"; if (argc != 2) { printf("사용법 : ./filename 포트번호 \n"); exit(0); } if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("Server: can not Open Socket\n"); exit(0); } //listen file descriptor 선언 // memset은 모든 값을 0으로 초기화 해주기위해 서버 실행 시 이용한다. memset(&server_addr, 0x00, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(atoi(argv[1])); //bind 과정 if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { printf("Server: can not bind local address\n"); exit(0); } printf("Waiting for clients...\n"); //listen 과정 if (listen(server_fd, 5) < 0) { printf("Server: can not listen connect. \n"); exit(0); } memset(buffer, 0x00, sizeof(buffer)); len = sizeof(client_addr); printf("=====[PORT] : %d =====\n", atoi(argv[1])); printf("Server: waiting connection request.\n"); // accept 기다리는 과정 while (1) { //클라이언트를 accept하는 과정 client_fd = accept(server_fd, (struct sockaddr *)&client_addr, (socklen_t *)&len); if (client_fd < 0) { printf("Server: accept failed\n"); exit(0); } inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, temp, sizeof(temp)); printf("Server: %s client connect,\n", temp); //서버에서 메세지 전송 printf("서버에서 보낼 말 :: Hello\n"); char buffer[BUFFER_LEN] = {0}; sprintf(buffer, "Hello\n"); write(client_fd, buffer, strlen(buffer)); //클라이언트 접속 종료 printf("Server: %s client closed.\n", temp); close(client_fd); } //서버 listen socket 종료 close(server_fd); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
< client.c >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | //client.cpp # include "header.h" int main(int argc, char** argv) { if (argc != 2) { printf("Usage: %s IPv4-address\n", argv[0]); return -1; } //서버에 접속할 소켓 데이터 구조 생성과정 int client_socket; struct sockaddr_in server_addr; char buff[BUFF_SIZE+5]; client_socket = socket(PF_INET, SOCK_STREAM, 0); if(client_socket == -1) { printf("socket 생성 실패\n"); exit(1); } //connect file descriptor 선언 // memset은 모든 값을 0으로 초기화 해주기위해 클라이언트 실행 시 이용한다. memset( &server_addr, 0, sizeof( server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(4000); // 포트번호를 4000으로 임의 지정해두었다. server_addr.sin_addr.s_addr= inet_addr("127.0.0.1"); // 서버 ip는 로컬 주소인 127.0.0.1로 지정해두었다. //서버에 접속하시오 if(connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { printf("접속 실패\n"); exit(1); } char buffer[BUFFER_LEN]; int n = read(client_socket, buffer, BUFFER_LEN); printf("%d bytes read\n", n); buffer[n] = '\0'; fputs(buffer, stdout); fflush(stdout); //클라이언트 접속 종료 close( client_socket); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
< 컴파일 및 실행 과정 >
반응형
'Applied > Network' 카테고리의 다른 글
소켓 프로그래밍 - (6) UDP 소켓 통신 응용(닉네임, 최대 인원, 메시지 응용) (2) | 2016.10.06 |
---|---|
소켓 프로그래밍 - (5) UDP 소켓 통신 (3) | 2016.10.06 |
소켓 프로그래밍 - (4) 서버에서 클라이언트로 메세지 전송 (헤더 이용 방식) (0) | 2016.10.02 |
소켓 프로그래밍 - (2) 서버 및 클라이언트 생성 (0) | 2016.09.13 |
소켓 프로그래밍 - (1) 리눅스에서 코딩 및 Compile 방법 (0) | 2016.09.12 |