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も通っています.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。