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

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

1回答

920閲覧

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/17 00:22

編集2020/01/17 01:26

JavaからCのプログラムにソケット通信で文字を送信したいのですが, 接続がタイムアウトしてしまいできません(CからJavaへ文字の送信はできたので, IPの設定等が原因ではないと思われます). 該当部分が下記になります.

Java

1public void Socket_notice() { 2 try { 3 // 送信先のIPアドレス(ドメインなどの名前)とポートを指定 4 Socket sock = new Socket("172.16.1.100",8888); 5 6 // 送信ストリームの取得 7 OutputStream out = sock.getOutputStream(); 8 9 // 送信 10 if(detection==true) { 11 char y='y'; 12 out.write(y); 13 out.flush(); 14 System.out.println(y+"を送信しました。"); 15 detection=false; 16 } 17 else if(detection==false) { 18 char n = 'n'; 19 out.write(n); 20 out.flush(); 21 System.out.println(n+"を送信しました。"); 22 } 23 24 out.close(); 25 sock.close(); 26 } 27 catch(Exception e){ 28 e.printStackTrace(); 29 } 30 }

C

1void sock_read(){ 2 int sockfd; 3 int client_sockfd; 4 struct sockaddr_in addr; 5 6 socklen_t len = sizeof( struct sockaddr_in ); 7 struct sockaddr_in from_addr; 8 9 char b[1]; 10 11 // 受信バッファ初期化 12 memset( b, 0, sizeof( b ) ); 13 14 // ソケット生成 15 if( ( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) { 16 perror( "socket" ); 17 } 18 19 // 待ち受け用IP・ポート番号設定 20 addr.sin_family = AF_INET; 21 addr.sin_port = htons(8888); 22 addr.sin_addr.s_addr = inet_addr("192.168.54.100"); 23 24 // 受信待ち 25 if( listen( sockfd, SOMAXCONN ) < 0 ) { 26 perror( "listen" ); 27 } 28 29 // クライアントからのコネクト要求待ち 30 if( ( client_sockfd = accept( sockfd, (struct sockaddr *)&from_addr, &len ) ) < 0 ) { 31 perror( "accept" ); 32 } 33 34 // 受信 35 int rsize; 36 rsize = recv( client_sockfd, b, sizeof( b ), 0 ); 37 38 if ( rsize == 0 ) { 39 // break; 40 } 41 else if ( rsize == -1 ) { 42 perror( "recv" ); 43 } 44 else { 45 if(b[1]=='y'){ 46 printf("yを受信しました"); 47 } 48 } 49 50 // ソケットクローズ 51 close( client_sockfd ); 52 close( sockfd ); 53} 54

java.net.ConnectException: Connection timed out: connect
at java.base/java.net.PlainSocketImpl.connect0(Native Method)
at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:101)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
at java.base/java.net.Socket.connect(Socket.java:591)
at java.base/java.net.Socket.connect(Socket.java:540)
at java.base/java.net.Socket.<init>(Socket.java:436)
at java.base/java.net.Socket.<init>(Socket.java:213)
at Standard_assignment.Socket_notice(Standard_assignment.java:328)
at Standard_assignment.Socket_ONOFF(Standard_assignment.java:318)
at Standard_assignment$MultiThread.run(Standard_assignment.java:290)

補足

C

1 if( bind( sockfd, (struct sockaddr *)&addr, sizeof( addr ) ) < 0 ) { 2 perror( "bind" ); 3 }

bindの記述が抜けていました, すみません.
しかし, これでも

bind: Cannot assign requested address

とエラーが出ます.

IPあどれすについても, ルーティング?を行っているのでpingも通っています.

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

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

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

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

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

guest

回答1

0

C言語側、listen する前に bind が必要では?

c

1 if(bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0){ 2 perror("bind"); 3 exit(-1); 4 }

IPアドレスが合ってないのも気になります。
C側を "0.0.0.0" にして、java側を "localhost" にして、ローカルホスト内で接続はできることは確認できました。

投稿2020/01/17 01:05

shiracamus

総合スコア5406

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問