回答編集履歴

4

追加コード整形

2020/01/22 07:26

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -13,8 +13,6 @@
13
13
  ```
14
14
 
15
15
  rsize = recv( sd, &b, sizeof(b), 0);
16
-
17
-
18
16
 
19
17
  ```
20
18
 
@@ -42,41 +40,35 @@
42
40
 
43
41
  #include <stdlib.h>
44
42
 
45
- #include <string.h>
46
-
47
43
  #include <unistd.h>
48
44
 
49
- #include <sys/types.h>
45
+ #include <arpa/inet.h>
50
46
 
51
47
  #include <sys/socket.h>
52
48
 
53
- #include <arpa/inet.h>
54
49
 
55
50
 
56
-
57
- void sock_write(int onof_flg){
51
+ void sock_write(int onof_flg) {
58
-
59
- int sd;
60
-
61
- char b;
62
-
63
- struct sockaddr_in addr;
64
-
65
-
66
52
 
67
53
  // IPv4 TCP のソケットを作成する
68
54
 
69
- if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
55
+ int sd = socket(AF_INET, SOCK_STREAM, 0);
56
+
57
+ if (sd < 0) {
70
58
 
71
59
  perror("socket");
72
60
 
73
-
61
+ return;
74
62
 
75
63
  }
76
64
 
77
65
 
78
66
 
67
+ // サーバ接続(TCP の場合は、接続を確立する必要がある)
68
+
79
69
  // 送信先アドレスとポート番号を設定する
70
+
71
+ struct sockaddr_in addr;
80
72
 
81
73
  addr.sin_family = AF_INET;
82
74
 
@@ -84,49 +76,31 @@
84
76
 
85
77
  addr.sin_addr.s_addr = inet_addr("127.0.0.1");
86
78
 
87
-
88
-
89
- // サーバ接続(TCP の場合は、接続を確立する必要がある)
90
-
91
79
  connect(sd, (struct sockaddr *)&addr, sizeof(addr));
92
80
 
93
81
 
94
82
 
95
- if(send(sd, "a\n", 2, 0) < 0) {
83
+ if (send(sd, "a\n", 2, 0) < 0) {
96
84
 
97
- perror("send a");
85
+ perror("send a");
98
86
 
99
- }
87
+ }
100
88
 
101
89
 
102
90
 
103
- int rsize;
91
+ char b;
104
92
 
105
- rsize = recv( sd, &b, sizeof(b), 0);
93
+ int rsize = recv(sd, &b, sizeof(b), 0);
106
94
 
95
+ if (rsize == -1) {
107
96
 
97
+ perror("recv");
108
98
 
109
- if (rsize == 0) {
99
+ } else if (rsize == 1 && b == 'y') {
110
100
 
111
- }
101
+ printf("y is returned\n");
112
102
 
113
- else if ( rsize == -1 ) {
114
-
115
- perror( "recv" );
116
-
117
- }
103
+ }
118
-
119
- else {
120
-
121
- if(b=='y'){
122
-
123
- printf("y is returned");
124
-
125
- sleep(1);
126
-
127
- }
128
-
129
- }
130
104
 
131
105
 
132
106
 

3

動作コード追記

2020/01/22 07:26

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -23,3 +23,123 @@
23
23
  `&b`を指定してポインタ変数そのものに読み込もうとしてますけど、おかしくないですか?
24
24
 
25
25
  ポインタ変数のサイズは4バイトか8バイトしかありませんよ。
26
+
27
+
28
+
29
+ それと、Java側がreadLineで改行するまで待っているのに、C側が改行コードを送ってません。
30
+
31
+
32
+
33
+ 以下のように修正したら動作しましたよ。
34
+
35
+ アドレスとポート番号は私の環境に合わせて変更してあるので、そちらの環境に合わせて修正して試してみてください。
36
+
37
+
38
+
39
+ ```c
40
+
41
+ #include <stdio.h>
42
+
43
+ #include <stdlib.h>
44
+
45
+ #include <string.h>
46
+
47
+ #include <unistd.h>
48
+
49
+ #include <sys/types.h>
50
+
51
+ #include <sys/socket.h>
52
+
53
+ #include <arpa/inet.h>
54
+
55
+
56
+
57
+ void sock_write(int onof_flg){
58
+
59
+ int sd;
60
+
61
+ char b;
62
+
63
+ struct sockaddr_in addr;
64
+
65
+
66
+
67
+ // IPv4 TCP のソケットを作成する
68
+
69
+ if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
70
+
71
+ perror("socket");
72
+
73
+
74
+
75
+ }
76
+
77
+
78
+
79
+ // 送信先アドレスとポート番号を設定する
80
+
81
+ addr.sin_family = AF_INET;
82
+
83
+ addr.sin_port = htons(8889);
84
+
85
+ addr.sin_addr.s_addr = inet_addr("127.0.0.1");
86
+
87
+
88
+
89
+ // サーバ接続(TCP の場合は、接続を確立する必要がある)
90
+
91
+ connect(sd, (struct sockaddr *)&addr, sizeof(addr));
92
+
93
+
94
+
95
+ if(send(sd, "a\n", 2, 0) < 0) {
96
+
97
+ perror("send a");
98
+
99
+ }
100
+
101
+
102
+
103
+ int rsize;
104
+
105
+ rsize = recv( sd, &b, sizeof(b), 0);
106
+
107
+
108
+
109
+ if (rsize == 0) {
110
+
111
+ }
112
+
113
+ else if ( rsize == -1 ) {
114
+
115
+ perror( "recv" );
116
+
117
+ }
118
+
119
+ else {
120
+
121
+ if(b=='y'){
122
+
123
+ printf("y is returned");
124
+
125
+ sleep(1);
126
+
127
+ }
128
+
129
+ }
130
+
131
+
132
+
133
+ close(sd);
134
+
135
+ }
136
+
137
+
138
+
139
+ int main() {
140
+
141
+ sock_write(1);
142
+
143
+ }
144
+
145
+ ```

2

説明追記

2020/01/22 04:37

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -3,6 +3,10 @@
3
3
  char *b;
4
4
 
5
5
  ```
6
+
7
+
8
+
9
+ ポインタ変数bを宣言し、
6
10
 
7
11
 
8
12
 

1

コード分割

2020/01/21 07:47

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -2,7 +2,11 @@
2
2
 
3
3
  char *b;
4
4
 
5
- ...
5
+ ```
6
+
7
+
8
+
9
+ ```
6
10
 
7
11
  rsize = recv( sd, &b, sizeof(b), 0);
8
12