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

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

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

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

Java

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

ソケット

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

Q&A

解決済

2回答

1965閲覧

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クリップ

投稿2019/12/17 06:34

前提・実現したいこと

CのプログラムからJavaのプログラムへ, ソケット通信で0か1の信号を送信したいのですが, Java側でエラーが発生しました。エラーの意味と解決方法がわからないので, 教えて下さい。

発生している問題・エラーメッセージ

java.io.EOFException at java.base/java.io.DataInputStream.readInt(DataInputStream.java:397) at Standard_assignment.acceptSocket(Standard_assignment.java:310) at Standard_assignment$MultiThread.run(Standard_assignment.java:297)

該当のソースコード

該当箇所だけ表記します。

C

1// ソケット通信 2void sock(int onof_flg){ 3 int sd; 4 struct sockaddr_in addr; 5 6 // IPv4 TCP のソケットを作成する 7 if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 8 perror("socket"); 9 return -1; 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.54.113"); 16 17 // サーバ接続(TCP の場合は、接続を確立する必要がある) 18 connect(sd, (struct sockaddr *)&addr, sizeof(addr)); 19 20 // パケットを TCP で送信 21 if(send(sd, onof_flg, 17, 0) < 0) { 22 perror("send"); 23 return -1; 24 } 25 26 close(sd); 27} 28 29/* 省略 */ 30 31onof_flg = ~onof_flg; 32sock(onof_flg);

Java

1class MultiThread extends Thread{ 2 public void run() { 3 acceptSocket(); 4 } 5 } 6 7 public void acceptSocket() { 8 try { 9 //アクセス待ち 10 Socket sock = svSock.accept(); 11 12 //受信ストリームの取得(DataInputStreamでラップ) 13 DataInputStream in = new DataInputStream(sock.getInputStream()); 14 15 //int型データを受信 16 intData = in.readInt(); 17 System.out.println("「"+intData+"」を受信しました。"); 18 19 //受信ストリームの終了 20 in.close(); 21 //サーバー終了 22 svSock.close(); 23 } 24 catch(IOException e){ 25 e.printStackTrace(); 26 } 27 } 28 29/* 省略 */ 30 31//ポート指定 32 try { 33 svSock = new ServerSocket(8888); 34 } 35 catch(IOException e){ 36 e.printStackTrace(); 37 } 38 39 while( true ){ 40 41 MultiThread mt = new MultiThread(); 42 mt.start();

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

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

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

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

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

dameo

2019/12/17 22:11

■最初に まず、ソースやエラーを貼るときは必ず全文を記載してください。 説明に必要な部分や、原因に直接影響する部分がどこなのか質問者さんには分からないことが多いからです。 もし全文貼れないようでしたら、ソースを質問用に現象を起こす最小限のものにしてから質問するようにしてください。 yukkeさんの指摘はただのミスリードだと思うので、気にすることはありません。 ■起きていること 以下のスタックトレースから分かるとおり Standard_assignment.acceptSocket(Standard_assignment.java:310) ServerSocketのacceptで取得したSocketからreadIntしているところで例外が発生しています。 readIntのAPIドキュメントを調べると https://docs.oracle.com/javase/jp/13/docs/api/java.base/java/io/DataInputStream.html#readInt() EOFException - 4バイトを読み終わる前に入力ストリームの終わりに達した場合。 という記述が見つけられます。 ■分かること クライアントのconnectとサーバのacceptは成功している。 しかし、接続確立後、最初の4バイトを読み取る前にクライアント側の送信がshutdownされている。 それ以上のことは省略されているので確実にはわかりません。 ■推測 クライアント側の送信が失敗している可能性があります。その場合、 プログラム名: send: XXXXX のようなエラーメッセージがクライアント側で表示されているはずです。 これ以上のことは省略されている部分があること、操作手順がないことから、確認できません。 私から言えることは以上です。 後は質問者さんがご自身で調べてみてください。 申し訳ありませんが、質問者さんと対話をする時間が私にはありません。 以降質問をいくら書き換えようとも、コメントをされようとも私は返事をしません。 なので、今後は省略をしないようにしてください。
xebme

2019/12/18 08:43

DataInputStreamのreadInt()は、32ビットの整数を4バイトの配列として期待している。つまり、ビッグエンディアンを仮定しています。Cは、ビッグエンディアンのバイト配列として送信していますか?
guest

回答2

0

ベストアンサー

今回の場合のようなものを「例外」といいます。
(入門書の例外系項目にも書かれているはず...)

例外の詳しい説明は入門書を読んでください。

概要として説明すると

コンパイルエラー: (変数が未定義だったりして)コンパイラが解釈不可能になる状態.

例外: 実行時に判明する、文字通りの"例外". 意図しないエラー.

です。

今回のメッセージを見ると、

EOFExceptionですね。 EOF ( 終端を示すもの ) Exception ( 例外 ) です。

そして、例外やコンパイルエラーなら検索してください。

documentationで検索すると、(厳密にはggりましたが...)

EOFException - Java docがヒット。

これによると、

入力の途中で、予想外のファイルの終了、または予想外のストリームの終了があったことを表すシグナルです。

とあります。

簡単に言えば、「メインサーバがクライアントにデータを送っている途中とかでクライアントが終了したため、処理を続行できない」みたいな意味だと思います。

まずはメッセージをよく読み、対処してください。

メッセージに答えが隠されています。

投稿2019/12/18 01:34

BeatStar

総合スコア4958

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

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

0

Cのソースコードの「send」の第2引数をint型からchar型にした(型を間違えていた)。

投稿2019/12/18 08:44

satosato

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問