socat은 의존성이 없는 두 채널 사이에서 양방향으로 데이터 전송을 중계한다. 각 채널은 파일, 파이프, 디바이스(serial line etc. or a pseudo terminal), 소켓(UNIX, IP4, IP6 - raw, UDP, TCP) 등 일 것이다.
자세한 정보는 socat 사이트로 가서 확인하길 바랍니다.
1. socat 다운로드
설치하는 방법은 간단합니다.
os에 따라 yum이나 apt-get으로 설치하는 방법이 있지만, 소스코드를 다운로드하여 설치해보려고 합니다.
socat 사이트로 가서 socat x.x.x.x.tar.gz 압축 파일을 다운로드 합니다.
저는 socat-1.7.2.0.tar.gz 파일을 다운로드 했습니다. 다운로드한 압축 파일을 해제 합니다.
[dhna@localhost ~/Downloads]$ tar xfz socat-1.7.2.0.tar.gz
2. socat 빌드
make파일을 만들고, 소스를 컴파일하고 실행파일을 생성합니다.
[dhna@localhost ~/Downloads/socat-1.7.2.0]$ mkdir ~/socat
[dhna@localhost ~/Downloads/socat-1.7.2.0]$ ./configure
[dhna@localhost ~/Downloads/socat-1.7.2.0]$ make
[dhna@localhost ~/Downloads/socat-1.7.2.0]$ prefix=~/socat make install
만약 make install만 한다면, Makefile의 prefix변수에 정의된 /usr/local내에 bin, share, man 디렉토리에 설치됩니다.
3. socat 사용하기
socat 프로그램을 한번 실행해보자.
[dhna@localhost ~/Downloads/socat-1.7.2.0/bin]$ socat udp-l:1235,fork udp:localhost:1234
4. socat 테스트 하기
과연 이 socat 프로그램이 잘 동작할까? udp 서버/클라이언트로 socat의 동작을 테스트 해보자.
[server.c]
// udp server source for socat test.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
int main(int argc, char **argv)
{
int sockfd;
int clilen;
int state;
struct sockaddr_in serveraddr, clientaddr;
int read;
char buffer[1024];
char respBuffer[1024];
clilen = sizeof(clientaddr);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
perror("socket error : ");
exit(0);
}
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(1234);
state = bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
if (state == -1)
{
perror("bind error : ");
exit(0);
}
printf("udp server reading...\n");
while(1)
{
read = recvfrom(sockfd, (void *)buffer, sizeof(buffer)-1, 0, (struct sockaddr *)&clientaddr, &clilen);
if (read < 0) {
printf("read is %d\n", read);
break;
}
buffer[read] = 0;
printf("buffer=%s\n", buffer);
strcpy(respBuffer, "response : ");
strcpy(respBuffer+11, buffer);
sendto(sockfd, (void *)respBuffer, read+strlen("response : "), 0, (struct sockaddr *)&clientaddr, clilen);
}
printf("udp server end....");
close(sockfd);
}
위의 소스코드를 server.c파일에 복사합니다. 그리고 gcc로 컴파일 합니다.
[dhna@localhost ~/socat]$ mkdir test
[dhna@localhost ~/socat]$ cd test
[dhna@localhost ~/socat/test]$ vi server.c
[dhna@localhost ~/socat/test]$ gcc server.c -o server
[client.c]
// udp client source for socat test
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
int main(int argc, char **argv)
{
int sockfd;
int clilen;
int state;
char buffer[255];
int sendCount;
int bufferLen;
struct sockaddr_in serveraddr;
memset(buffer, 0x00, 255);
clilen = sizeof(serveraddr);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
perror("socket error : ");
exit(0);
}
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serveraddr.sin_port = htons(1235);
printf("udp client sending....\n");
sendCount = 0;
while(sendCount < 1000) {
sprintf(buffer, "data count is %d", sendCount++);
bufferLen = strlen(buffer);
sendto(sockfd, (void *)buffer, bufferLen, 0, (struct sockaddr *)&serveraddr, clilen);
bufferLen = recvfrom(sockfd, (void *)buffer, sizeof(buffer)-1, 0, NULL, NULL);
if (bufferLen < 0) {
printf("read is %d\n", bufferLen);
break;
}
buffer[bufferLen] = 0;
printf("buffer=%s\n", buffer);
sleep(1);
}
printf("udp client end......\n");
close(sockfd);
}
위의 소스코드를 client.c파일에 복사합니다. 그리고 gcc로 컴파일 합니다.
[dhna@localhost ~/socat/test]$ vi client.c
[dhna@localhost ~/socat/test]$ gcc client.c -o client
'컴퓨터 활용 > 리눅스 활용' 카테고리의 다른 글
[우분투] 편리한 터미널 에뮬레이터 Tilda (0) | 2013.02.17 |
---|---|
[리눅스] mount 명령어 (0) | 2012.12.03 |
[우분투] 파티션 관리 (NTFS, FAT32, EXT4, EXT3 ...) (0) | 2012.12.03 |
[쉘 스크립트] date 명령으로 unix time 출력하기 (0) | 2012.06.21 |
[쉘 스크립트] awk를 사용하여 파일 삭제하기 (0) | 2012.03.01 |
[vi editor] vim tab to space 설정과 tap space 설정 (0) | 2012.02.28 |
[Makefile] Makefile 작성하기 (옵션) (0) | 2011.10.31 |
실무 예제로 배우는 UNIX 쉘 프로그래밍-정보문화사 (0) | 2011.10.26 |
[쉘 스크립트] 파일 이름, 경로, 확장자 구하기 (0) | 2011.10.26 |
[쉘 스크립트] TEST 명령어 (0) | 2011.10.26 |