与Java服务器通信的C99客户端

与Java服务器通信的C99客户端,java,c,sockets,Java,C,Sockets,我正在尝试让C99客户端与Java服务器通信。但是,Java服务器接收的数据与传输的数据不同。(即@x�@Ófl/ú.��@¨�����������������(英国石油公司) 我一直认为这是一个编码问题,但我遇到了麻烦。我试着测试这两个程序,以得出结论:Java服务器能够与Java客户机通信,而C客户机能够与C服务器通信 但是,我无法让Java服务器与C客户机通信 Java代码: serverSocket = new ServerSocket(port); Socket sock = ser

我正在尝试让C99客户端与Java服务器通信。但是,Java服务器接收的数据与传输的数据不同。(即@x�@Ófl/ú.��@¨�����������������(英国石油公司)

我一直认为这是一个编码问题,但我遇到了麻烦。我试着测试这两个程序,以得出结论:Java服务器能够与Java客户机通信,而C客户机能够与C服务器通信

但是,我无法让Java服务器与C客户机通信

Java代码:

serverSocket = new ServerSocket(port);  
Socket sock = serverSocket.accept();                               

BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));

String inputString = in.readLine();
System.out.println(inputString);
C代码:

struct sockaddr_in sin;
struct hostent *host;

host = gethostbyname(hostname);

bzero(&(sin.sin_zero),8); 
sin.sin_port = htons(port);
sin.sin_addr = *((struct in_addr *)host->h_addr);
sin.sin_family = AF_INET;

sock = socket(AF_INET, SOCK_STREAM, 0);

if(connect(sock, (struct sockaddr *)&sin,sizeof(struct sockaddr_in)) == -1)

编辑:我尝试在两台主机之间发送单词“TEST”,但没有成功。

修复:在传递消息变量时,消息变量前面有一个与号。

应该是:

send(sock, message, strlen(message)+1, 0);

我不确定C99是否提供了编码标准,但我认为它是特定于实现的。例如,它可以是
US-ASCII

发生的情况是,Java
InputStreamReader
(或output)使用操作系统或Java安装(不确定在何处)中指定的默认字符集,因此与C程序使用的字符集相比可能有所不同

您可以做的最好的事情是测试各种编码,
InputStreamReader
类确实提供了一个特定的构造函数:

public InputStreamReader(InputStream in, Charset cs)

其中允许您指定要使用的字符集。查看可能的字符集。

我不确定C99是否提供了编码标准,但我认为它是特定于实现的。例如,它可以是
US-ASCII

发生的情况是,Java
InputStreamReader
(或output)使用操作系统或Java安装(不确定在何处)中指定的默认字符集,因此与C程序使用的字符集相比可能有所不同

您可以做的最好的事情是测试各种编码,
InputStreamReader
类确实提供了一个特定的构造函数:

public InputStreamReader(InputStream in, Charset cs)

其中允许您指定要使用的字符集。查看可能的字符集。

您还必须查看endian差异:Java使用,而C主机可能不使用<代码>ByteBuffer,如图所示,可能会有所帮助。

您还必须查看endian差异:Java使用,而C主机可能不使用<代码>字节缓冲,如图所示,可能会有所帮助。

您的问题看起来像字节对齐

C
客户端中,需要将主机转换为网络字节顺序

使用


您的问题看起来像是字节对齐

C
客户端中,需要将主机转换为网络字节顺序

使用


如果我没说错的话,你可以说:

char *message = "Hello";
        int i = 0;
        for (char ch : inputString.toCharArray()) {
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                (int)ch & 0xff,
                (int)ch & 0xff,
                (int)ch & 0xff,
                Character.isISOControl(ch) ? '.' : ch
            );
        }
    while (true) {
        in.mark(128);
        if ((inputLine = in.readLine()) == null)
            continue;

        System.out.println("Response: " + inputLine);

        in.reset();
        i = 0;
        while (in.ready()) {
            c = in.read();
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                c, c, c,
                Character.isISOControl((char) c) ? '.' : (char)c
            );
        }
    }
当您通过以下方式发送:

send(sock, &message, strlen(message)+1, 0);
           |
           +---- Err.
您发送的是消息的地址,而不是消息本身,进一步将长度设置为消息的长度,并使用垃圾填充

如果您改为这样做:

send(sock, message, strlen(message)+1, 0);
它应该会起作用

或者使用
charmessage[]=“Hello”


要进一步剖析服务器数据,可以执行以下操作:

char *message = "Hello";
        int i = 0;
        for (char ch : inputString.toCharArray()) {
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                (int)ch & 0xff,
                (int)ch & 0xff,
                (int)ch & 0xff,
                Character.isISOControl(ch) ? '.' : ch
            );
        }
    while (true) {
        in.mark(128);
        if ((inputLine = in.readLine()) == null)
            continue;

        System.out.println("Response: " + inputLine);

        in.reset();
        i = 0;
        while (in.ready()) {
            c = in.read();
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                c, c, c,
                Character.isISOControl((char) c) ? '.' : (char)c
            );
        }
    }

使用消息(&M):

Client said: `�
 0: 0x60 o140  96 `
 1: 0xEF o357 239 ￯
 2: 0xBF o277 191 ﾿
 3: 0xBD o275 189 ᄑ
 4: 0x04 o004   4 .
 5: 0x08 o010   8 .

另一种黑客/调试/方法是:

char *message = "Hello";
        int i = 0;
        for (char ch : inputString.toCharArray()) {
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                (int)ch & 0xff,
                (int)ch & 0xff,
                (int)ch & 0xff,
                Character.isISOControl(ch) ? '.' : ch
            );
        }
    while (true) {
        in.mark(128);
        if ((inputLine = in.readLine()) == null)
            continue;

        System.out.println("Response: " + inputLine);

        in.reset();
        i = 0;
        while (in.ready()) {
            c = in.read();
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                c, c, c,
                Character.isISOControl((char) c) ? '.' : (char)c
            );
        }
    }

如果我没说错的话,你可以说:

char *message = "Hello";
        int i = 0;
        for (char ch : inputString.toCharArray()) {
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                (int)ch & 0xff,
                (int)ch & 0xff,
                (int)ch & 0xff,
                Character.isISOControl(ch) ? '.' : ch
            );
        }
    while (true) {
        in.mark(128);
        if ((inputLine = in.readLine()) == null)
            continue;

        System.out.println("Response: " + inputLine);

        in.reset();
        i = 0;
        while (in.ready()) {
            c = in.read();
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                c, c, c,
                Character.isISOControl((char) c) ? '.' : (char)c
            );
        }
    }
当您通过以下方式发送:

send(sock, &message, strlen(message)+1, 0);
           |
           +---- Err.
您发送的是消息的地址,而不是消息本身,进一步将长度设置为消息的长度,并使用垃圾填充

如果您改为这样做:

send(sock, message, strlen(message)+1, 0);
它应该会起作用

或者使用
charmessage[]=“Hello”


要进一步剖析服务器数据,可以执行以下操作:

char *message = "Hello";
        int i = 0;
        for (char ch : inputString.toCharArray()) {
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                (int)ch & 0xff,
                (int)ch & 0xff,
                (int)ch & 0xff,
                Character.isISOControl(ch) ? '.' : ch
            );
        }
    while (true) {
        in.mark(128);
        if ((inputLine = in.readLine()) == null)
            continue;

        System.out.println("Response: " + inputLine);

        in.reset();
        i = 0;
        while (in.ready()) {
            c = in.read();
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                c, c, c,
                Character.isISOControl((char) c) ? '.' : (char)c
            );
        }
    }

使用消息(&M):

Client said: `�
 0: 0x60 o140  96 `
 1: 0xEF o357 239 ￯
 2: 0xBF o277 191 ﾿
 3: 0xBD o275 189 ᄑ
 4: 0x04 o004   4 .
 5: 0x08 o010   8 .

另一种黑客/调试/方法是:

char *message = "Hello";
        int i = 0;
        for (char ch : inputString.toCharArray()) {
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                (int)ch & 0xff,
                (int)ch & 0xff,
                (int)ch & 0xff,
                Character.isISOControl(ch) ? '.' : ch
            );
        }
    while (true) {
        in.mark(128);
        if ((inputLine = in.readLine()) == null)
            continue;

        System.out.println("Response: " + inputLine);

        in.reset();
        i = 0;
        while (in.ready()) {
            c = in.read();
            System.out.printf("%2d: 0x%02X o%03o %3d %c%n",
                i++,
                c, c, c,
                Character.isISOControl((char) c) ? '.' : (char)c
            );
        }
    }

来自C的消息的编码是什么?那么我的答案是正确的;)来自C的消息的编码是什么?那么我的答案是正确的;)C客户机根据nl_langinfo(代码集)使用US-ASCII字符集,因此这不是字符编码问题。我还强制Java服务器使用InputStreamReader使用此字符集,但没有成功。C客户端根据nl_langinfo(代码集)使用US-ASCII字符集,因此这不是字符编码问题。我还强制Java服务器使用InputStreamReader使用此字符集,但没有成功。我发送的是文本,而不是原始数字。请参考此问题,以发送字符数组。从客户端向服务器发送单词“test”无效。消息中没有任何数字,因此我怀疑这是问题所在。我发送的是文本,而不是原始数字。请参考此问题,以发送字符数组。从客户端向服务器发送单词“test”无效。消息中没有任何数字,因此我怀疑这是问题所在。