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

回答編集履歴

4

追加コード整形

2020/01/22 07:26

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -6,7 +6,6 @@
6
6
 
7
7
  ```
8
8
  rsize = recv( sd, &b, sizeof(b), 0);
9
-
10
9
  ```
11
10
 
12
11
  `&b`を指定してポインタ変数そのものに読み込もうとしてますけど、おかしくないですか?
@@ -20,50 +19,38 @@
20
19
  ```c
21
20
  #include <stdio.h>
22
21
  #include <stdlib.h>
23
- #include <string.h>
24
22
  #include <unistd.h>
25
- #include <sys/types.h>
23
+ #include <arpa/inet.h>
26
24
  #include <sys/socket.h>
27
- #include <arpa/inet.h>
28
25
 
29
- void sock_write(int onof_flg){
26
+ void sock_write(int onof_flg) {
30
- int sd;
31
- char b;
32
- struct sockaddr_in addr;
33
-
34
27
  // IPv4 TCP のソケットを作成する
35
- if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
28
+ int sd = socket(AF_INET, SOCK_STREAM, 0);
29
+ if (sd < 0) {
36
30
  perror("socket");
37
-
31
+ return;
38
32
  }
39
33
 
34
+ // サーバ接続(TCP の場合は、接続を確立する必要がある)
40
35
  // 送信先アドレスとポート番号を設定する
36
+ struct sockaddr_in addr;
41
37
  addr.sin_family = AF_INET;
42
38
  addr.sin_port = htons(8889);
43
39
  addr.sin_addr.s_addr = inet_addr("127.0.0.1");
44
-
45
- // サーバ接続(TCP の場合は、接続を確立する必要がある)
46
40
  connect(sd, (struct sockaddr *)&addr, sizeof(addr));
47
41
 
48
- if(send(sd, "a\n", 2, 0) < 0) {
42
+ if (send(sd, "a\n", 2, 0) < 0) {
49
- perror("send a");
43
+ perror("send a");
50
- }
44
+ }
51
45
 
52
- int rsize;
46
+ char b;
53
- rsize = recv( sd, &b, sizeof(b), 0);
47
+ int rsize = recv(sd, &b, sizeof(b), 0);
48
+ if (rsize == -1) {
49
+ perror("recv");
50
+ } else if (rsize == 1 && b == 'y') {
51
+ printf("y is returned\n");
52
+ }
54
53
 
55
- if (rsize == 0) {
56
- }
57
- else if ( rsize == -1 ) {
58
- perror( "recv" );
59
- }
60
- else {
61
- if(b=='y'){
62
- printf("y is returned");
63
- sleep(1);
64
- }
65
- }
66
-
67
54
  close(sd);
68
55
  }
69
56
 

3

動作コード追記

2020/01/22 07:26

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -10,4 +10,64 @@
10
10
  ```
11
11
 
12
12
  `&b`を指定してポインタ変数そのものに読み込もうとしてますけど、おかしくないですか?
13
- ポインタ変数のサイズは4バイトか8バイトしかありませんよ。
13
+ ポインタ変数のサイズは4バイトか8バイトしかありませんよ。
14
+
15
+ それと、Java側がreadLineで改行するまで待っているのに、C側が改行コードを送ってません。
16
+
17
+ 以下のように修正したら動作しましたよ。
18
+ アドレスとポート番号は私の環境に合わせて変更してあるので、そちらの環境に合わせて修正して試してみてください。
19
+
20
+ ```c
21
+ #include <stdio.h>
22
+ #include <stdlib.h>
23
+ #include <string.h>
24
+ #include <unistd.h>
25
+ #include <sys/types.h>
26
+ #include <sys/socket.h>
27
+ #include <arpa/inet.h>
28
+
29
+ void sock_write(int onof_flg){
30
+ int sd;
31
+ char b;
32
+ struct sockaddr_in addr;
33
+
34
+ // IPv4 TCP のソケットを作成する
35
+ if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
36
+ perror("socket");
37
+
38
+ }
39
+
40
+ // 送信先アドレスとポート番号を設定する
41
+ addr.sin_family = AF_INET;
42
+ addr.sin_port = htons(8889);
43
+ addr.sin_addr.s_addr = inet_addr("127.0.0.1");
44
+
45
+ // サーバ接続(TCP の場合は、接続を確立する必要がある)
46
+ connect(sd, (struct sockaddr *)&addr, sizeof(addr));
47
+
48
+ if(send(sd, "a\n", 2, 0) < 0) {
49
+ perror("send a");
50
+ }
51
+
52
+ int rsize;
53
+ rsize = recv( sd, &b, sizeof(b), 0);
54
+
55
+ if (rsize == 0) {
56
+ }
57
+ else if ( rsize == -1 ) {
58
+ perror( "recv" );
59
+ }
60
+ else {
61
+ if(b=='y'){
62
+ printf("y is returned");
63
+ sleep(1);
64
+ }
65
+ }
66
+
67
+ close(sd);
68
+ }
69
+
70
+ int main() {
71
+ sock_write(1);
72
+ }
73
+ ```

2

説明追記

2020/01/22 04:37

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -2,6 +2,8 @@
2
2
  char *b;
3
3
  ```
4
4
 
5
+ ポインタ変数bを宣言し、
6
+
5
7
  ```
6
8
  rsize = recv( sd, &b, sizeof(b), 0);
7
9
 

1

コード分割

2020/01/21 07:47

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -1,6 +1,8 @@
1
1
  ```
2
2
  char *b;
3
- ...
3
+ ```
4
+
5
+ ```
4
6
  rsize = recv( sd, &b, sizeof(b), 0);
5
7
 
6
8
  ```