2016-11-28 40 views
3

我有一个服务器应用上用C写:是否可以使用Unix套接字在C应用程序和Java应用程序之间创建通信?

int main(int argc, char const *argv[]) { 

int sock; 

struct sockaddr_un serv_addr; 

size_t serv_addr_len; 

int msgsock; 
char buf[1024]; 
int msg_len; 

remove(SOCKET_ADDRESS); 

sock = socket(AF_UNIX, SOCK_SEQPACKET, 0); 

if (sock < 0) { 
    perror("Opening stream socket"); 
    exit(1); 
} 

memset(&serv_addr, 0, sizeof(serv_addr)); 

serv_addr.sun_family = AF_UNIX; 

strcpy(serv_addr.sun_path, SOCKET_ADDRESS); 

serv_addr_len = strlen(serv_addr.sun_path) + sizeof(serv_addr.sun_family); 

if (bind(sock, (struct sockaddr *) &serv_addr, serv_addr_len)) { 
    perror("Binding stream socket"); 
    exit(1); 
} 

if (listen(sock, 5) < 0) { 
    perror("Listening falied"); 
    exit(1); 
} 

while (TRUE) { 
    msgsock = accept(sock, (struct sockaddr *) 0, 0); 

    if (msgsock == -1) { 
     perror("Accept"); 
    } 
    else { 
     do { 
      memset(buf, 0, sizeof(buf)); 

      if ((msg_len = recv(msgsock, buf, sizeof(buf), MSG_WAITALL)) < 0) { 
       perror("Reading stream message"); 
      } 
      else if (msg_len == 0) { 
       printf("Ending connection\n"); 
      } 
      else { 
       printf("%s\n", buf); 
      } 
     } while (msg_len > 0); 

     close(msgsock); 
    } 
} 
return 0; 
} 

而且有一个客户端上的Java写了junixsocket lib目录下:

package client; 

import java.io.*; 
import org.newsclub.net.unix.AFUNIXSocket; 
import org.newsclub.net.unix.AFUNIXSocketAddress; 

public class Client { 

public static void main(String args[]) { 

    final String socketAddress = "/home/andrew/IdeaProjects/Sample/tmp/SOCKET_ADDRESS"; 

    String message = "Hello Server!"; 

    try { 
     final File socketFile = new File(socketAddress); 

     AFUNIXSocket socket = AFUNIXSocket.newInstance(); 

     socket.connect(new AFUNIXSocketAddress(socketFile)); 

     OutputStream out = socket.getOutputStream(); 

     out.write(message.getBytes()); 
     out.flush(); 
     socket.close(); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 

我开始服务器,并尝试connnect,然后得到异常:

/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java -Didea.launcher.port = 7533 -Didea.launcher.bin.path = /家庭/安德鲁/下载/ idea-IU-163.7743.44/bin -Dfile.encoding = UTF-8 -classpath /usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/charsets.jar:/usr/lib/jvm/java-1.8.0-openjdk -amd64/JRE/lib/ext目录/ cldrdata.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-1.8 0.0-的openjdk-AMD64/JRE/lib/ext目录/的IcedTea-sound.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/jaccess.jar:/ usr/lib中/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/nashorn.jar: /usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/包含了sunjce_provider.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/ lib/ext目录/ zipfs.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/jce.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/ JRE/lib目录/ jsse.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/management-agent.jar:/usr/lib/jvm/java-1.8.0-openjdk- AMD64/JRE/lib中/ resources.jar:/ usr/lib中/ JVM/JA VA-1.8.0-的OpenJDK,AMD64/JRE/lib中/ rt.jar的:/家庭/安德鲁/ IdeaProjects /样品/出/生产/样品:/home/andrew/Workspace/libs/junixsocket-1.3.jar:/家/andrew/Workspace/libs/junixsocket-demo-1.3.jar:/home/andrew/Workspace/libs/junixsocket-mysql-1.3.jar:/home/andrew/Workspace/libs/junixsocket-rmi-1.3.jar:/ home/andrew/Downloads/idea-IU-163.7743.44/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain client.Client org.newsclub.net.unix.AFUNIXSocketException:协议错误类型为 socket(socket:/ home/andrew/IdeaProjects/Sample/tmp/SOCKET_ADDRESS) at org.newsclub.net.unix.NativeUnixSocket.connect(Native Method)at org.newsclub.net.unix.AFUNIXSocketImpl.connect(AFUNIXSocketImpl。 java:125) at org.newsclub.net.unix.AFUNIXSocket.connect(AFUNIXSocket.java:97) at org .newsclub.net.unix.AFUNIXSocket.connect(AFUNIXSocket.java:87) at client.Client.main(Client.java:19)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect。 NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)在 com.intellij .rt.execution.application.AppMain.main(AppMain.java:147)

请帮帮我!

+0

Java和C程序应该能够通信,因为它们都使用套接字。你得到的具体错误似乎是这部分“AFUNIXSocketException:套接字的协议错误类型” – dahui

回答

0

unix域套接字是一种特定于平台的机制,如果没有本机库,java不支持它。您使用org.newsclub.net.unix.AFUNIXSocket。但该库仅支持插座类型SOCK_STREAMSOCK_DGRAM。您的C应用程序使用SOCK_SEQPACKET,它是该库不支持的unix域套接字的特定于linux的扩展。

+0

你是对的!谢谢! – AndrewSynkov

相关问题