質問するログイン新規登録

質問編集履歴

4

完成版の更新方法を誤っていました。

2020/05/13 04:41

投稿

nekoatsume
nekoatsume

スコア7

title CHANGED
File without changes
body CHANGED
@@ -68,6 +68,8 @@
68
68
  exit(EXIT_FAILURE);
69
69
 
70
70
  }
71
+
72
+ ```
71
73
 
72
74
 
73
75
  ```C言語(メッセージ受信側)

3

お二人にご指摘いただいた点をもとに修正し、無事に動かすことができましたので更新します。

2020/05/13 04:41

投稿

nekoatsume
nekoatsume

スコア7

title CHANGED
File without changes
body CHANGED
@@ -13,59 +13,63 @@
13
13
  ```C言語(メッセージ送信側)
14
14
  #include <stdio.h>
15
15
  #include <stdlib.h>
16
- #include <string.h>
16
+ #include <string.h>
17
17
  #include <sys/types.h>
18
18
  #include <sys/ipc.h>
19
19
  #include <sys/msg.h>
20
20
  #include <errno.h>
21
-
21
+
22
22
  #define KEY 2020
23
-
24
- int main()
25
- {
26
- int msgid;
27
- FILE *fp=NULL;
28
- typedef struct{
29
- long mtype;
30
- int send_size;
31
- char data[1024];
32
- }DATA;
33
- extern int errno;
34
-
35
- DATA data;
36
- data.mtype=0;
37
- data.send_size=0;
38
-
39
-
40
-   
41
-
42
- if((msgid=msgget(KEY,0666|IPC_CREAT))==-1){
43
- printf("MsgGet Error=%d\n",errno);
44
- exit(EXIT_FAILURE);
45
- }
46
-
47
- if((fp=fopen("gazou","rb"))==NULL){
48
- printf("ファイルが開けませんでした");
49
- fclose(fp);
50
- }
51
-
52
- while(feof(fp)==0){
53
- data.send_size=fread(&data.data,1,1024,fp);
54
- if(msgsnd(msgid,&data,data.send_size+sizeof(int),0)==-1){
55
- printf("MsgSnd Error=%d\n",errno);
56
- exit(EXIT_FAILURE);
57
- }
58
-
59
- else{
60
- printf("Sender Done!\n");
61
-       exit(EXIT_SUCCESS);
62
- }
63
- }
64
-
65
- }
66
-
67
23
 
24
+ typedef struct{
25
+ long mtype;
26
+ int send_size;
27
+ char image[1024];
68
- ```
28
+ }DATA;
29
+
30
+ int main()
31
+ {
32
+ DATA data;
33
+ data.mtype=1;
34
+ data.send_size=0;
35
+ char mtext[256];
36
+
37
+ int msgid;
38
+ FILE *fp;
39
+ extern int errno;
40
+
41
+
42
+ if((msgid=msgget(KEY,0666|IPC_CREAT))==-1){
43
+ printf("MsgGet Error=%d\n",errno);
44
+ exit(EXIT_FAILURE);
45
+ }
46
+
47
+ if((fp=fopen("gazou.png","rb"))==NULL){
48
+ printf("ファイルが開けませんでした");
49
+ exit(EXIT_FAILURE);
50
+ }
51
+
52
+
53
+
54
+ while(feof(fp)==0){
55
+ data.send_size=fread(&data.image,1,1024,fp);
56
+ printf("%d\n",data.send_size);
57
+ printf("%ld\n",sizeof(data)-sizeof(long));
58
+ printf("msgid:%d\n",msgid);
59
+ if(msgsnd(msgid,&data,data.send_size+sizeof(int),0)==-1){
60
+ printf("errno=%d\n",errno);
61
+ perror(mtext);
62
+ fputs(mtext,stdout);
63
+ exit(EXIT_FAILURE);
64
+ }
65
+
66
+ }
67
+ fclose(fp);
68
+ exit(EXIT_FAILURE);
69
+
70
+ }
71
+
72
+
69
73
  ```C言語(メッセージ受信側)
70
74
  #include <stdio.h>
71
75
  #include <string.h>
@@ -74,66 +78,60 @@
74
78
  #include <sys/ipc.h>
75
79
  #include <sys/msg.h>
76
80
  #include <errno.h>
77
-
81
+
78
82
  #define KEY 2020
83
+
79
-
84
+ typedef struct{
85
+ long mtype;
86
+ int send_size;
87
+ char image[1024];
88
+ }DATA;
89
+
90
+
80
- int main(int argc,char* argv[])
91
+ int main(int argc,char* argv[])
81
- {
92
+ {
82
- FILE *fp=NULL;
93
+ int status=EXIT_FAILURE;
83
- int msgid;
94
+ int msgid;
84
- int no;
95
+ extern int errno;
85
-
86
- typedef struct{
96
+
87
- long mtype;
88
- int send_size;
89
- char data[1024];
90
- } DATA;
91
- DATA data;
97
+ DATA data;
98
+
99
+ FILE *fp;
92
- int status=EXIT_FAILURE;
100
+ char mmtext[256];
93
-
101
+
102
+
94
103
 
95
-   struct msgbuff{
96
- long mtype;
97
- char mtext[80];
98
- }b;
99
- extern int errno;
100
-
101
- data.send_size=0;
104
+ data.send_size=0;
102
-
105
+
103
- if((fp=fopen("gazou","wb"))==NULL){
106
+ if((fp=fopen("gazou2.png","wb"))==NULL){
104
- printf("ファイルが開けませんでした");
107
+ printf("ファイルが開けませんでした");
105
- exit(EXIT_FAILURE);
108
+ exit(EXIT_FAILURE);
106
- }
107
-
108
- if(argc<2){
109
- printf("Argument required.\n");
110
- exit(status);
111
- }
112
-
113
- printf("Recieve %d Start.\n",no=atoi(argv[1]));
114
- if((msgid=msgget(KEY,0666|IPC_CREAT))==-1){
115
- printf("MsgGet Error=%d\n",errno);
116
- exit(status);
117
109
  }
110
+
111
+
118
-
112
+ if((msgid=msgget(KEY,0666|IPC_CREAT))==-1){
119
-
113
+ printf("MsgGet Error=%d\n",errno);
114
+ exit(status);
115
+ }
116
+
117
+
120
- while(1){
118
+ while(1){
121
- if(msgrcv(msgid,&data,sizeof(data)-sizeof(long),0,0)==-1){
119
+ if(msgrcv(msgid,&data,sizeof(data)-sizeof(long),0,0)==-1){
122
- data.send_size=fwrite(&data,1,data.send_size,fp);
123
- if(errno==ENOMSG){
124
- printf("Receive %d End. \n",no);
125
- status=EXIT_SUCCESS;
126
- }else{
127
- printf("MsgRcv Error=%d\n",errno);
120
+ printf("recieve error=%d\n",errno);
121
+ perror(mmtext);
128
- status=EXIT_FAILURE;
122
+ exit(EXIT_FAILURE);
129
- }
123
+ }
124
+ fwrite(&data.image,1,data.send_size,fp);
125
+ printf("data.send_size=%d\n",data.send_size);
126
+
127
+ if(data.send_size<1024){
130
- break;
128
+ break;
131
- }
129
+ }
132
- printf("Receive%2d:",no);
133
- fputs(b.mtext,stdout);
134
- }
130
+ }
131
+ printf("書込み終了\n");
132
+ fclose(fp);
135
- exit(status);
133
+   exit(EXIT_SUCCESS);
136
- }
134
+ }
137
135
 
138
136
  ```
139
137
 

2

SHOMI様の追記をもとに編集してみました。

2020/05/13 04:40

投稿

nekoatsume
nekoatsume

スコア7

title CHANGED
File without changes
body CHANGED
@@ -117,10 +117,10 @@
117
117
  }
118
118
 
119
119
 
120
- while(data.send_size<=1024){
120
+ while(1){
121
121
  if(msgrcv(msgid,&data,sizeof(data)-sizeof(long),0,0)==-1){
122
- data.send_size=fwrite(&data,1,1024,fp);
122
+ data.send_size=fwrite(&data,1,data.send_size,fp);
123
- if(errno=ENOMSG){
123
+ if(errno==ENOMSG){
124
124
  printf("Receive %d End. \n",no);
125
125
  status=EXIT_SUCCESS;
126
126
  }else{

1

ご指摘いただいた点のコードを修正してみました。ただ、送信側を実行するとMsgsndError=22と表示されます。システムコールだと思いますが調べても対処法が見つけられずわかっていないです。

2020/05/12 16:52

投稿

nekoatsume
nekoatsume

スコア7

title CHANGED
File without changes
body CHANGED
@@ -33,8 +33,11 @@
33
33
  extern int errno;
34
34
 
35
35
  DATA data;
36
- mtype=0;
36
+ data.mtype=0;
37
-    data send_size;
37
+ data.send_size=0;
38
+
39
+
40
+   
38
41
 
39
42
  if((msgid=msgget(KEY,0666|IPC_CREAT))==-1){
40
43
  printf("MsgGet Error=%d\n",errno);
@@ -47,8 +50,8 @@
47
50
  }
48
51
 
49
52
  while(feof(fp)==0){
50
- send_size=fread(&data,1,1024,fp);
53
+ data.send_size=fread(&data.data,1,1024,fp);
51
- if(msgsnd(msgid,&data,send_size+sizeof(long),0)==-1){
54
+ if(msgsnd(msgid,&data,data.send_size+sizeof(int),0)==-1){
52
55
  printf("MsgSnd Error=%d\n",errno);
53
56
  exit(EXIT_FAILURE);
54
57
  }
@@ -94,6 +97,8 @@
94
97
  char mtext[80];
95
98
  }b;
96
99
  extern int errno;
100
+
101
+ data.send_size=0;
97
102
 
98
103
  if((fp=fopen("gazou","wb"))==NULL){
99
104
  printf("ファイルが開けませんでした");
@@ -112,9 +117,9 @@
112
117
  }
113
118
 
114
119
 
115
- while(send_size<1024){
120
+ while(data.send_size<=1024){
116
- send_size=fwrite(&data,1,1024,fp);
117
- if(msgrcv(msgid,&data,sizeof(data)-sizeof(long),0,0)==-1){
121
+ if(msgrcv(msgid,&data,sizeof(data)-sizeof(long),0,0)==-1){
122
+ data.send_size=fwrite(&data,1,1024,fp);
118
123
  if(errno=ENOMSG){
119
124
  printf("Receive %d End. \n",no);
120
125
  status=EXIT_SUCCESS;