繁体   English   中英

通过套接字将int从Java发送到C-奇怪的结果

[英]Sending int via socket from Java to C - strange results

我有一个用Java编写的简单服务器,它只将Integer发送到连接的客户端。 我有一个用C编写的客户端,该客户端连接到服务器并打印出接收到的Integer。

我的问题是结果有所不同。 在执行客户端的过程中,大约有一半的时间我得到了正确的结果(234),而其他时候我得到了8323072。

这是服务器:

class TCPServer {
  public static void main(String args[]) throws Exception {
     ServerSocket welcomeSocket = new ServerSocket(6789);

     while(true)
     {
        Socket connectionSocket = welcomeSocket.accept();
        System.out.println("welcomeSocket.accept() called");
        DataInputStream inFromClient = new DataInputStream(connectionSocket.getInputStream());
        DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());

        outToClient.writeInt(234);
     }
  }

}

这是客户:

int main(int argc, char *argv[])
{
    if(argc != 4){
        printUsage();
        return;
    }

    char* serverIP = argv[1];
    char* serverPortC = argv[2];
    char* integerToSendC = argv[3];

    int serverPort = atoi(serverPortC);
    int integerToSend = atoi(integerToSendC);

    int socketDesc = socket(AF_INET, SOCK_STREAM, 0);

    if(socketDesc < 0) {
        printf("Error when creating socket\n");
        return;
    } 

    struct sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(serverPort);
    inet_pton(AF_INET, serverIP, &serverAddr.sin_addr);

    int connection = connect(socketDesc, (struct sockaddr*) &serverAddr, sizeof serverAddr);

    if(connection < 0) {
        printf("Error when establishing connection\n");
        return;
    }

    char intBuffer[4];

    if(recv(socketDesc, intBuffer, sizeof intBuffer, 0) == -1){
        printf("Error while receiving Integer\n");
    }

    int receivedInt = ntohl(*((int *) &intBuffer));

    printf("Received int: %d\n", receivedInt);

    close(socketDesc);
}

在此先感谢您的帮助!

编辑:所以最后我做了这样的事情,只针对有相同问题的任何人:

while(receivedBytes < 4){
    int readBytes = read(receiverSocket, &intBuffer, (sizeof intBuffer) - receivedBytes, receivedBytes);
    receivedInteger += (intBuffer << (8*receivedBytes));
    receivedBytes += readBytes;
}

您可以确定在客户端收到了sizeof intBuffer字节吗? 不,您不能,因为recv()可能返回的字节数少于请求的字节数。

您可以修改代码,使其在recv()周围循环,只要接收到的字节数少于请求的字节数,并且没有发生错误。

注意recv() 0字节表示该连接已被另一端关闭。

还要确保服务器端以网络字节顺序发送。

另外^ 2:最好至少在开发阶段初始化变量(此处为intBuffer ),这会说:在调整阶段之前。

您的问题可能是由于各种数据类型的子边界所致。

在Java中,将4个字节分配给int ,将2个字节分配给short
在C中, long 4个字节, int 2个字节。

这意味着Java int > C longJava short > C int
现在,这取决于您的优先级。

如果要使用Java执行大量数学计算并将结果通过套接字发送到C,建议您使用Java int -> C long
如果您只想发送小数字并使用C进行大量计算,请执行Java short > C int转换。

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM