2012-06-16 5 views
3

두 개의 서로 다른 컴퓨터 (서버와 클라이언트)에 C 구조가 있습니다. 예 :두 개의 C 구조 사이에 데이터 복사

struct account { 
    int account_number; 
    char *first_name; 
    char *last_name; 
    float balance; 
}; 

제 질문은 컴퓨터간에 데이터를 복제 할 수있는 방법은 무엇입니까? 어쩌면 XML로 데이터를 변환하고 복사하려고 할 수 있습니까? 아니면 배열을 사용할 수 있습니까?

+1

데이터를 바이트 청크로 변환하고 바이트를 다른 컴퓨터로 전송 한 다음 해당 바이트를 디코딩해야합니다. 바이트 수준에서 정의 할 수있는 한 텍스트, XML 또는 원하는 다른 형식을 사용할 수 있습니다. –

+1

C 직렬화 라이브러리 목록을 보려면 [this] (http://stackoverflow.com/questions/371371/serialize-data-structures-in-c)를 참조하십시오. 당신은 아마 그들 중 하나를 사용할 수 있습니다. – dirkgently

+1

@blackbear 문자열에 문제가 없지만 int 및 float에 대한 바이트 순서/단어 크기에 문제가 발생할 수 있습니다. – gcbenison

답변

1

가장 간단하고 가벼운 솔루션 - 당신은 FILE*의 형태로 두 컴퓨터 사이의 연결을 열린이있는 경우 - 한쪽 끝 fprintf로 전송하고, 다른 한편으로 fscanf으로 디코딩 할 수 있습니다.

protocol.h :

typedef struct _packet packet_t; 

struct _packet { 
    int account_number; 
    char *first_name; 
    char *last_name; 
    float balance; 
}; 

static const char packet_fmt[]=" acct: %d fname: %s sname: %s balance: %f"; 

보낸 사람 :

... 
    printf(packet_fmt, acct, "Greg", "Benison", bal); 
    ... 

청취자 :

... 
int n_read = fscanf(fin, packet_fmt, &acct, fname, sname, &balance); 

if (n_read == 4) 
    printf("Received balance update for %s %s: %f\n", fname, sname, balance); 
... 

당신의 네 개의 필드 구조체 충분 수 있지만, 당신은 그 구조의 변화를 예상하는 경우 XML, JSON 또는 기타 형식적 인코딩을 추구하는 것이 중요 할 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 예를 들어 전체 구조체를 배열로 변환하고 네트워크를 통해 다른 컴퓨터로 보낼 수 있습니까? 그런 다음 배열은 struct로 다시 변환됩니다. – user1285928

+1

그것이 바로이 코드의 기능입니다. 'printf'는 구조를 문자 배열로 변환하고'fscanf'는 그것을 다시 변환합니다. –

1

C에 익숙하다면 TCP 소켓을 사용하여 데이터를 보내고받을 수 있습니다. 기본적으로 원시 바이트 및 지정된 순서로 데이터를 전송해야 수신 할 때 디코딩 할 수 있습니다. 당신은 기계의 노력을 허용해야하며 가변 길이 이름의 길이를 지정하기 위해 데이터의 추가 필드를 보내야합니다 (수신 할 바이트 수를 알 수 있도록). 일반적으로 보내는 데이터 패킷의 총 크기를 나타내는 필드를 추가하는 것이 좋습니다. 기본적으로 사용자는 데이터 패킷을 인코딩하여 원하는 방식으로 인코딩 할 수 있으며 다른 쪽 끝에서 데이터를 전송할 때와 동일한 방법으로 데이터 패킷을 전송할 수 있습니다. 어쩌면이 일을하는 오래된 모자 방법 일지 모르지만 나는 하루 종일이 방법을 사용하여 컴퓨터간에 데이터를 전송합니다. 사용 가능한 여러 옵션 중 하나입니다. 데이터를 다른 형식의 xml 형식으로 보낼 수 있지만 원시 바이트를 보내면 패킷 크기가 작아집니다 (주소를 지정해야하는 문제 일 수도 있고 아닐 수도 있습니다). 희망이 도움이됩니다.

+0

C 프로그래밍을 처음 접했습니다. 코드 예제를 통해이 접근법에 대한 자습서를 어디에서 찾을 수 있는지 알고 있습니까? 프로젝트가 오픈 소스라면 코드를 공유 할 수 있습니까? – user1285928

+0

흠 C를 처음 접한다면 학습 곡선이 필요합니다. 나는 분명히 작업 코드를 공유 할 수 없다. 리눅스에서 일하는 경우 http://beej.us/guide/bgnet/에서 시작하는 것이 좋습니다. – mathematician1975

관련 문제