前提・実現したいこと
C言語初心者で勉強している者です。できれば今日中に解決したいです。
画像データをバイナリファイルで読み込んで、メッセージの送受信を行いたいです。
(別プログラムでのメッセージの送受信)
発生している問題・エラーメッセージ
送信側、受信側ともにsend_sizeがundeclated(first use this function)となり
機能していないようですが原因がわかりません。
他にもプログラム上に問題があれば、ソースコードで教えていただけますと幸いです。
C言語(メッセージ送信側)
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <sys/types.h> 5#include <sys/ipc.h> 6#include <sys/msg.h> 7#include <errno.h> 8 9#define KEY 2020 10 11typedef struct{ 12 long mtype; 13 int send_size; 14 char image[1024]; 15 }DATA; 16 17 int main() 18 { 19 DATA data; 20 data.mtype=1; 21 data.send_size=0; 22 char mtext[256]; 23 24 int msgid; 25 FILE *fp; 26 extern int errno; 27 28 29 if((msgid=msgget(KEY,0666|IPC_CREAT))==-1){ 30 printf("MsgGet Error=%d\n",errno); 31 exit(EXIT_FAILURE); 32 } 33 34 if((fp=fopen("gazou.png","rb"))==NULL){ 35 printf("ファイルが開けませんでした"); 36 exit(EXIT_FAILURE); 37 } 38 39 40 41 while(feof(fp)==0){ 42 data.send_size=fread(&data.image,1,1024,fp); 43 printf("%d\n",data.send_size); 44 printf("%ld\n",sizeof(data)-sizeof(long)); 45 printf("msgid:%d\n",msgid); 46 if(msgsnd(msgid,&data,data.send_size+sizeof(int),0)==-1){ 47 printf("errno=%d\n",errno); 48 perror(mtext); 49 fputs(mtext,stdout); 50 exit(EXIT_FAILURE); 51 } 52 53 } 54 fclose(fp); 55 exit(EXIT_FAILURE); 56 57 } 58
C言語(メッセージ受信側)
1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#include <sys/types.h> 5#include <sys/ipc.h> 6#include <sys/msg.h> 7#include <errno.h> 8 9#define KEY 2020 10 11typedef struct{ 12 long mtype; 13 int send_size; 14 char image[1024]; 15 }DATA; 16 17 18 int main(int argc,char* argv[]) 19 { 20 int status=EXIT_FAILURE; 21 int msgid; 22 extern int errno; 23 24 DATA data; 25 26 FILE *fp; 27 char mmtext[256]; 28 29 30 31 data.send_size=0; 32 33 if((fp=fopen("gazou2.png","wb"))==NULL){ 34 printf("ファイルが開けませんでした"); 35 exit(EXIT_FAILURE); 36 } 37 38 39 if((msgid=msgget(KEY,0666|IPC_CREAT))==-1){ 40 printf("MsgGet Error=%d\n",errno); 41 exit(status); 42 } 43 44 45 while(1){ 46 if(msgrcv(msgid,&data,sizeof(data)-sizeof(long),0,0)==-1){ 47 printf("recieve error=%d\n",errno); 48 perror(mmtext); 49 exit(EXIT_FAILURE); 50 } 51 fwrite(&data.image,1,data.send_size,fp); 52 printf("data.send_size=%d\n",data.send_size); 53 54 if(data.send_size<1024){ 55 break; 56 } 57 } 58 printf("書込み終了\n"); 59 fclose(fp); 60 exit(EXIT_SUCCESS); 61 } 62
Linuxのubuntu上で開発しています。
1つ目でgazouというファイルを1024バイトずつ読み取ってメッセージキューで2つ目に送り、2つ目でキューから読み取ったデータをgazouというファイルに書き込む、ということが実現したいことですか?
コメントありがとうございます。
実現したいことはほぼご認識のとおりなのですが、
本文に記載漏れしていたところを追記します。
1バイトを1024個ずつ読み込んで、
データが1024より小さいことを確認して終了するような状態にしたいです。
(送信側も1バイトずつ送信して受信側が0になったときにfcloseする)
また、書き込んだファイル名は別名にしようと思っています。
本文に書いておらず申し訳ございません。
実行結果の確認方法についてもよくわかっていないので教えていただけたら幸いです、、。
質問が多く申し訳ございませんがよろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー