7.Pro C와 C# 연동하기 기본 개념, 내용 프로세스 간 통신(IPC), 파일 기반 데이터 교환, 네트워크 소켓 활용.

Pro*C는 C 프로그래밍 언어를 사용하여 Oracle 데이터베이스와 연동하는 중재 언어입니다. C#은 .NET 프레임워크의 일부로, 객체 지향 프로그래밍 언어입니다. 이 두 언어를 연동하여 안정적이고 효율적인 데이터베이스 애플리케이션을 구축하기 위한 다양한 방법들이 존재합니다. 이 글에서는 Pro*C와 C# 간의 연동을 위한 세 가지 주요 방법, 즉 프로세스 간 통신(IPC), 파일 기반 데이터 교환, 네트워크 소켓 활용 방법을 다루겠습니다.

1. 프로세스 간 통신(IPC)

프로세스 간 통신(IPC)은 서로 다른 프로세스들이 데이터를 주고받기 위한 전략으로, 메모리 공유, 메시지 큐, 파이프, 소켓 등 여러 방법을 사용할 수 있습니다. Pro*C와 C#을 연동하는 데 있어 IPC를 활용하는 것은 다수의 애플리케이션이 서로 데이터를 효율적으로 교환하는 데 매우 유용합니다.

1.1. IPC의 이해

IPC는 물리적으로 다른 주소 공간에서 실행되고 있는 프로세스들 간의 데이터 교환을 가능하게 합니다. 일반적으로 두 가지 방법이 가장 많이 사용됩니다:

  • 공유 메모리: 두 프로세스가 동일한 메모리 공간을 공유하여 데이터를 교환하는 기법입니다.
  • 메시지 패싱: 한 프로세스가 다른 프로세스에 메시지를 보내고 수신하는 방식으로, 일반 소켓이나 파이프를 사용할 수 있습니다.

1.2. Pro*C와 IPC 연동 예제

아래는 Pro*C에서 IPC를 사용하여 C#과 데이터를 전달하는 예제입니다.

/* Pro*C 코드 예제 */
#include <stdio.h>
#include <sqlca.h>
#include <stdlib.h>

void sendMessage(char *message) {
    // 메시지를 C# 쪽으로 전송하는 로직 구현
}

int main() {
    /* 데이터베이스 연결 및 쿼리 처리 */
    executeQuery(); // 쿼리 실행
    sendMessage("Hello from Pro*C"); // C#으로 메시지 전송
    return 0;
}

위의 Pro*C 코드는 간단하게 DB와 연결하고 메시지를 C#으로 보낼 수 있는 구조를 보여줍니다. C# 쪽에서는 해당 메시지를 수신하게 되어 있습니다.

2. 파일 기반 데이터 교환

파일 기반 데이터 교환은 데이터를 파일을 통해 주고받는 방법으로, 데이터를 영속적으로 저장할 필요가 있을 때 유용합니다. Pro*C에서는 쿼리 결과를 파일에 저장하고, C#에서는 해당 파일을 읽어들이는 방식으로 연동할 수 있습니다.

2.1. 파일 생성 및 쓰기

Pro*C에서 쿼리 결과를 파일에 저장하는 예제입니다.

/* Pro*C 파일 쓰기 예제 */
#include <stdio.h>
#include <sqlca.h>
#include <stdlib.h>
#include <string.h>

void writeToFile(char *filename, char *data) {
    FILE *file = fopen(filename, "w");
    if (file == NULL) {
        perror("Unable to open file!");
        exit(1);
    }
    fprintf(file, "%s", data);
    fclose(file);
}

int main() {
    /* DB 작업 후 쿼리 결과를 data 변수에 저장 */
    char data[100] = "DB 작업 결과";
    writeToFile("output.txt", data); // 결과를 output.txt에 저장
    return 0;
}

위의 코드는 Pro*C 프로그램이 쿼리 결과를 “output.txt”라는 파일에 쓰는 방법을 보여줍니다. 다음으로 C#에서 해당 파일을 읽는 방법을 다루어 보겠습니다.

2.2. 파일 읽기 (C# 예제)

/* C# 파일 읽기 예제 */
using System;
using System.IO;

class Program {
    static void Main(string[] args) {
        string filename = "output.txt";
        string data = File.ReadAllText(filename); // 파일에서 데이터 읽기
        Console.WriteLine(data); // 읽은 데이터 출력
    }
}

C# 코드는 Pro*C로 생성된 “output.txt” 파일에서 데이터를 읽어오는 방법을 보여줍니다. 이렇게 파일 기반 데이터 교환을 통해 둘 간의 상호작용이 가능해집니다.

3. 네트워크 소켓 활용

네트워크 소켓은 다른 컴퓨터에서 실행 중인 애플리케이션과 IPC를 가능하게 하는 방법으로, 클라이언트-서버 모델을 기반으로 합니다. 소켓을 사용하여 Pro*C와 C#이 서로 데이터를 주고받을 수 있습니다.

3.1. 소켓 이해하기

소켓은 네트워크에서 두 컴퓨터 간의 연결을 수립하기 위한 기술입니다. 소켓을 통해 프로세스는 TCP/IP 프로토콜을 사용하여 서로 통신할 수 있습니다. 클라이언트는 서버에 연결 요청을 하고, 서버는 요청을 수락하여 통신을 시작합니다.

3.2. Pro*C에서 소켓 서버 구현

/* Pro*C 소켓 서버 예제 */
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main() {
    int socket_desc;
    struct sockaddr_in server, client;
    char *message = "Hello from Pro*C Server";

    // 소켓 생성
    socket_desc = socket(AF_INET, SOCK_STREAM, 0);
    if (socket_desc == -1) {
        printf("Could not create socket");
    }

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(8888);

    // 바인드 및 리슨
    bind(socket_desc, (struct sockaddr *)&server, sizeof(server));
    listen(socket_desc, 3);
    printf("Waiting for incoming connections...\n");

    int c = sizeof(struct sockaddr_in);
    int new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
    send(new_socket, message, strlen(message), 0);
    close(new_socket);
    close(socket_desc);
    return 0;
}

위의 Pro*C 코드는 간단한 소켓 서버를 구현하여 클라이언트로부터 연결 요청을 수신하고 “Hello from Pro*C Server” 메시지를 전송하는 구조를 보여줍니다.

3.3. C#에서 소켓 클라이언트 구현

/* C# 소켓 클라이언트 예제 */
using System;
using System.Net.Sockets;
using System.Text;

class Program {
    static void Main() {
        TcpClient client = new TcpClient("127.0.0.1", 8888);
        NetworkStream stream = client.GetStream();
        
        byte[] bytes = new byte[256];
        int bytesRead = stream.Read(bytes, 0, bytes.Length);
        string responseData = Encoding.UTF8.GetString(bytes, 0, bytesRead);
        
        Console.WriteLine("Received: {0}", responseData);
        client.Close();
    }
}

C# 클라이언트는 Pro*C 서버에 연결하여 데이터를 수신하는 방법을 보여줍니다. 위의 예제에서는 Pro*C 서버로부터 받은 메시지를 콘솔에 출력합니다.

결론

이번 글에서는 Pro*C와 C# 간의 연동 방안을 알아보았습니다. IPC, 파일 기반 데이터 교환, 네트워크 소켓 활용 등 다양한 방법이 있으며, 각 방법의 장단점과 실제 코드 예제를 통해 이론을 더욱 구체화했습니다. 애플리케이션의 요구 사항에 따라 적절한 연동 방법을 선택하여 구현함으로써 효율적인 데이터 교환을 가능하게 할 수 있습니다. 이러한 기법들을 활용하여 데이터베이스와 강력한 C# 애플리케이션을 개발하는 데 많은 도움이 되기를 바랍니다.