메시지큐를 이용해서 파일 복사하기.
데이터 전송 프로젝트 세번째, 메시지 큐를 이용해서 파일을 복사하는 프로그램입니다. 사실 메시지큐는 구조체를 이용해서 데이터를 넘길 수 있기 때문에 아무 생각 없이 파일명과 데이터를 한꺼번에 넘길 수 있어서 좋았습니다만...
역시 데이터의 길이, 파일명의 길이에 대해 완벽한 해법을 찾지 못하겠습니다. 이번에는 복사된 object 파일의 끝에 쓰레기 값이 붙는 것을 확인할 수 있었습니다. (제 생각으로는 1024 같이 Magic number를 써서 buf의 길이를 지정했기 때문에 이런 현상이 발생하는 것 같습니다.)
쓰레기 값이 붙지 않고 파일을 제대로 복사할 수 있는 방법이 없을까요?
거두절미하고 소스코드를 보시죠.
server.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <fcntl.h>
#include <stdio.h>#define MSQKEY 34855
#define FILENAMELEN 10
#define MSQSIZE 32struct mymsgbuf {
char filename[FILENAMELEN];
char mtext[1024];
};int main(int argc, char **argv)
{
void fatal(char *);
key_t key;
int n, object, msqid;
struct mymsgbuf mb = {0, 0};
key = MSQKEY;
if((msqid = msgget(key, IPC_CREAT|IPC_EXCL|0666)) < 0)
fatal("msgget");
while((n = msgrcv(msqid, &mb, sizeof(struct mymsgbuf), 0, 0)) > 0)
{
if((object = open(mb.filename, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)
fatal("write open");
write(object, mb.mtext, 1024);
}
if(msgctl(msqid, IPC_RMID, (struct msqid_ds *)0) < 0)
fatal("msgctl");
close(object);
return 0;
}void fatal(char *error_name)
{
perror(error_name);
exit(1);
}
client.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <fcntl.h>
#include <stdio.h>#define MSQKEY 34855
#define FILENAMELEN 10
#define MSQSIZE 32struct mymsgbuf {
char filename[FILENAMELEN];
char mtext[1024];
};int main(int argc, char **argv)
{
void fatal(char *);
key_t key;
int n, msqid, source;
struct mymsgbuf mb = {0, 0};
char buf[1024];
if((source = open(argv[1], O_RDONLY)) < 0)
fatal("open readfile");
key = MSQKEY;
if((msqid = msgget(key, 0666)) < 0)
fatal("msgget");strcpy(mb.filename, argv[2]);
while((n = read(source, buf, 1024)) > 0)
{
strncpy(mb.mtext, buf, n);
printf("%s", mb.mtext);
if(msgsnd(msqid, &mb, sizeof(struct mymsgbuf), 0) == -1)
fatal("msgsnd");
}
return 0;
}void fatal(char *error_name)
{
perror(error_name);
exit(1);
}
문제라..
n = msgrcv(msqid, &mb, sizeof(struct mymsgbuf), 0, 0))
에서 n은 메시지 큐로 부터의 받아진 text의 길이 입니다..
구조체에서 n만큼만 읽어 들리면 되는 겁니다..
보낼 때로 n만큼 보내면 길이가 맞게 되는 것이죠...
댓글 달기