質問編集履歴
4
完成版の更新方法を誤っていました。
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
お二人にご指摘いただいた点をもとに修正し、無事に動かすことができましたので更新します。
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
|
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
|
-
|
91
|
+
int main(int argc,char* argv[])
|
81
|
-
|
92
|
+
{
|
82
|
-
|
93
|
+
int status=EXIT_FAILURE;
|
83
|
-
|
94
|
+
int msgid;
|
84
|
-
|
95
|
+
extern int errno;
|
85
|
-
|
86
|
-
|
96
|
+
|
87
|
-
long mtype;
|
88
|
-
int send_size;
|
89
|
-
char data[1024];
|
90
|
-
} DATA;
|
91
|
-
|
97
|
+
DATA data;
|
98
|
+
|
99
|
+
FILE *fp;
|
92
|
-
|
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
|
-
|
104
|
+
data.send_size=0;
|
102
|
-
|
105
|
+
|
103
|
-
|
106
|
+
if((fp=fopen("gazou2.png","wb"))==NULL){
|
104
|
-
|
107
|
+
printf("ファイルが開けませんでした");
|
105
|
-
|
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
|
-
|
118
|
+
while(1){
|
121
|
-
|
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
|
-
|
120
|
+
printf("recieve error=%d\n",errno);
|
121
|
+
perror(mmtext);
|
128
|
-
|
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
|
-
|
128
|
+
break;
|
131
|
-
|
129
|
+
}
|
132
|
-
printf("Receive%2d:",no);
|
133
|
-
fputs(b.mtext,stdout);
|
134
|
-
|
130
|
+
}
|
131
|
+
printf("書込み終了\n");
|
132
|
+
fclose(fp);
|
135
|
-
|
133
|
+
exit(EXIT_SUCCESS);
|
136
|
-
|
134
|
+
}
|
137
135
|
|
138
136
|
```
|
139
137
|
|
2
SHOMI様の追記をもとに編集してみました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -117,10 +117,10 @@
|
|
117
117
|
}
|
118
118
|
|
119
119
|
|
120
|
-
while(
|
120
|
+
while(1){
|
121
121
|
if(msgrcv(msgid,&data,sizeof(data)-sizeof(long),0,0)==-1){
|
122
|
-
data.send_size=fwrite(&data,1,
|
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と表示されます。システムコールだと思いますが調べても対処法が見つけられずわかっていないです。
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
|
-
|
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(
|
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;
|