아래의 소켓 - 서버 예제 프로그램을 참조한다.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> //소켓 프로그래밍에 사용될 헤더파일 선언 #define BUF_LEN 128 //메시지 송수신에 사용될 버퍼 크기를 선언 int main(int argc, char *argv[]) { char buffer[BUF_LEN]; struct sockaddr_in server_addr, client_addr; char temp[20]; int server_fd, client_fd; //server_fd, client_fd : 각 소켓 번호 int len, msg_size; int port = 9876; if(argc != 2) { printf("usage : %s [port]\n", argv[0]); exit(0); } if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {// 소켓 생성 printf("Server : Can't open stream socket\n"); exit(0); } memset(&server_addr, 0x00, sizeof(server_addr)); //server_Addr 을 NULL로 초기화 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(port)); //server_addr 셋팅 if(bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) <0) {//bind() 호출 printf("Server : Can't bind local address.\n"); exit(0); } if(listen(server_fd, 5) < 0) {//소켓을 수동 대기모드로 설정 printf("Server : Can't listening connect.\n"); exit(0); } memset(buffer, 0x00, sizeof(buffer)); printf("Server : wating connection request.\n"); len = sizeof(client_addr); client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &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 connected.\n", temp); int exit_flag =1; char full_path[100] = {0,}; char backup[1024] = {0,}; FILE *rfp = NULL; while(exit_flag) { msg_size = read(client_fd, buffer, 1024); if(strncmp(buffer,"ACK",3) == 0) { if(!feof(rfp)) { char rbuf[1024] = {0,}; fgets(rbuf, sizeof(rbuf), rfp); write(client_fd, rbuf, strlen(rbuf)+1); memset(backup,0x00,sizeof(backup)); strcpy(backup,rbuf); }else { exit_flag =0; } }else if(strncmp(buffer,"ACK",3) == 0) { write(client_fd, backup, strlen(backup)+1); }else if(atoi(buffer) > 0) { //fclose() .. rfp , wfp //fopen with full_path // move to line ( for(i<line) { fgets() } //rearrange with rfp, wfp }else { //fopen with full path // fget with one line // write to client } } // write(client_fd, buffer, msg_size); fclose(rfp); close(client_fd); //printf("Server : %s client closed.\n", temp); close(server_fd); return 0; }
아래 참조 링크 참조한다.
https://luckyyowu.tistory.com/88