質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

Q&A

3回答

1377閲覧

JavaからCのプログラムにソケット通信でデータを送信できません

satosato

総合スコア20

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

0グッド

0クリップ

投稿2020/01/16 02:22

編集2020/01/16 02:52

JavaからCのプログラムにソケット通信で文字を送信したいのですが, C側で正常に受け取りができていないのかread関数で動作が停止します.

該当のソースコード

Java

1public void Socket_test() { 2 try { 3 BufferedReader reader = null; 4 String line = null; 5 6 //アクセス待ち 7 Socket sock = svSock.accept(); 8 9 //受信ストリームの取得 10 reader = new BufferedReader(new InputStreamReader(sock.getInputStream())); 11 12 // 送信ストリームの取得 13 OutputStream out = sock.getOutputStream(); 14 15 line = reader.readLine(); 16 17 if(line.equals("a")) { 18 System.out.println("a is received"); 19 char y='y'; 20 out.write(y); 21 out.flush(); 22 System.out.println("「"+y+"」を送信しました。"); 23 } 24}

C

1void sock_notice(void){ 2 int sd; 3 struct sockaddr_in addr; 4 char buf; 5 6 // IPv4 TCP のソケットを作成する 7 if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 8 perror("socket"); 9 10 } 11 12 // 送信先アドレスとポート番号を設定する 13 addr.sin_family = AF_INET; 14 addr.sin_port = htons(8888); 15 addr.sin_addr.s_addr = inet_addr("192.168.100.1"); 16 17 // サーバ接続(TCP の場合は、接続を確立する必要がある) 18 connect(sd, (struct sockaddr *)&addr, sizeof(addr)); 19 20 // パケットを TCP で送信 21 if(send(sd, "a", 1, 0) < 0) { 22 perror("send a"); 23 } 24 25 // 受信 26 if(read(sd, &buf, 1, 0) < 0) { 27 perror("read buf"); 28 } 29 30 if(strcmp(&buf,'y')){ 31 printf("y\n"); 32 } 33 else{ 34 printf("n\n"); 35 } 36 37 close(sd); 38}

補足

 受信の箇所(read関数)でCのソースコードがフリーズしているので, 受信ができているのかも不明です.
また, この状態でCのソースコードを強制終了した瞬間に"a is received" 「y」を送信しました。" がJavaのコンソールに出力されました.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

「JavaからCのプログラムにソケット通信で文字を送信したい」というのであれば、
Javaでデータを送信するプログラムを、Cでデータを受信するプログラムを用意しなければなりません。
動作の手順は次のようになります
・CでserverSocketを作って、acceptで待つ
・JavaでSocketを作って、Cで作ったServerSocketにconnectする
・Cでconnectされたsocketをacceptする
・Javaでconnectしたsocketを使って文字を送る
・Cでconnectされたsocketから文字を読み取る

ところが質問に書かれたプログラムでは、Cのプログラムに

// パケットを TCP で送信 if(send(sd, "a", 1, 0) < 0) { perror("send a"); }

とパケットを送信するコードが、

Javaのプログラムに

//アクセス待ち Socket sock = svSock.accept();

とTCPコネクション待ちのコードが書かれています。

何か勘違いがあるのではないかと思います。

投稿2020/01/16 04:29

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2020/01/16 08:45

> 受信の箇所(read関数)でCのソースコードがフリーズしている ということを指して > JavaからCのプログラムに と言われているのではないでしょうか.
guest

0

BufferedReader.readLine は改行を読み込むか close されるまでブロックします.

クラスBufferedReader readLine

readLine
public String readLine()
throws IOException

テキスト行を読み込みます。1行の終端は、改行('\n')か、復帰('\r')、または復帰とそれに続く改行のいずれかで認識されます。

なお, java のほうもソケットはきちんと close するようにしてください.

投稿2020/01/16 03:00

編集2020/01/16 08:48
jimbe

総合スコア12648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Java

1 if(line.equals("a")) { 2 char y='y'; 3 out.write(y); 4 out.flush(); // ← この行を追加 5 }

Java側で"a"を受信できているなら、out.write(y);がバッファリングされている可能性があります。
上記のように、明示的にflushしてみるとどうなりますでしょうか?

投稿2020/01/16 02:31

rtr1950x

総合スコア298

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問