================================ Outline ====================================
Echo Server
Echo Client
makefile
----------------------------------------------------------------------------
Echo Server
/*** 소스 ***/
#include "smartsock.h"
int main(void) { int iSock; //소켓 함수의 반환 값을 받는 변수 int icSock; //accept의 반환 값을 받는 변수 int iRet; struct sockaddr_in stAddr; socklen_t uiSockLen=sizeof(struct sockaddr); char cBuff[Buf_Size]; const char * cP;
iSock = socket(AF_INET, SOCK_STREAM, 0); //AF_INET = 2, if(0 > iSock) { perror("socket : "); return -1; } // stAddr구조체에 socket연결을 위한 필수 정보 입력 setting bzero(&stAddr, sizeof(stAddr)); //구조체 비우기(0으로 채우기) stAddr.sin_family = AF_INET; //#define AF_INET 2 /* IP protocol family. */ stAddr.sin_addr.s_addr = inet_addr(IP); //IP와 PORT값은 헤더파일에 정의되어 있다. stAddr.sin_port = htons((PORT));
iRet = bind(iSock, (struct sockaddr *)&stAddr,sizeof(stAddr)); if(iRet < 0) { perror("bind : "); close(iSock);
return -2; } iRet = listen(iSock, 5); if(iRet != 0) { perror("listen : "); close(iSock);
return -3; }
icSock = accept(iSock, (struct sockaddr *)&stAddr, &uiSockLen); //접속자의 정보가 stAddr에 입력된다.
if(icSock < 0) { perror("Accept : "); close(iSock);
return -4; }
close(iSock);
printf("Incoming Client \n"); //cP = inet_ntoa(stAddr.sin_addr); printf("Client IP :%s\n", inet_ntoa(stAddr.sin_addr)); printf("Client Port : %d\n", ntohs(stAddr.sin_port));
write(icSock, "Welcome :)", sizeof("Welcome :)"));
while(1) { read(icSock, cBuff, MSG_Size); printf("[client]: [%s]\n", cBuff);
write(icSock, cBuff, MSG_Size); if(0 == strncmp(MSG_END, cBuff, strlen(MSG_END) ) ) break; } close(icSock); return 0; }
|
Echo Client
/*** 소스 ***/
#include "smartsock.h"
int main(void) { struct sockaddr_in stAddr; int iSock; int iRet; char cBuff[Buf_Size]; socklen_t uiSockLen=sizeof(struct sockaddr);
iSock = socket(AF_INET, SOCK_STREAM, 0); if(0 > iSock) { perror("socket : "); return -1; }
bzero(&stAddr, sizeof(stAddr)); stAddr.sin_family = AF_INET; stAddr.sin_addr.s_addr = inet_addr(IP); stAddr.sin_port = htons((PORT));
iRet = connect(iSock, (struct sockaddr *)&stAddr, uiSockLen); if(0 > iRet) { perror("connect : "); return -2; }
read(iSock, cBuff, MSG_Size); printf("[server]: [%s]\n", cBuff); while(1) {
iRet = read(0, cBuff, MSG_Size); cBuff[iRet-1] = 0; write(iSock, cBuff, MSG_Size); read(iSock, cBuff, MSG_Size); printf("[server]: [%s]\n", cBuff);
if(0 == strncmp(MSG_END, cBuff, strlen(MSG_END))) break; } close(iSock); return 0; }
|
smartsock.h
/*** 소스 ***/
#ifndef __SMARTSOCK_H__ #define __SMARTSOCK_H__ #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/stat.h> #include <unistd.h> //read&write 함수 #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <errno.h> //error 출력 #include <strings.h> //bzero 함수
#define PORT 7777 #define IP "192.168.0.173" #define MSG_Size 255 //버퍼 사이즈 정의 #define Buf_Size (MSG_Size+1)
#define MSG_END "quit"
#endif // __SMARTSOCK_H__
|
makefile
/*** 소스 ***/
CC = gcc
CTRG = client
STRG = server
SSRC = server.c
CSRC = client.c
CFLAGS = --save-temps
all: ser cli
rebuild: clean all
ser: @$(CC) $(CFLAGS) -o $(STRG) $(SSRC)
cli: @$(CC) $(CFLAGS) -o $(CTRG) $(CSRC)
clean: @rm -rf $(STRG) $(STRG).o $(STRG).i $(STRG).s @rm -rf $(CTRG) $(CTRG).o $(CTRG).i $(CTRG).s
|
Packet Analyzer를 만들어보자.
netinet/in.h에 있는 파일을 들어가서 0번부터 17번까지 스위치문으로 정의해보자.