Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C和x2B之间的连接+;Socket与Java客户端 我在C++中创建了一个服务器应用程序,在java中创建了一个客户端应用程序。我想在它们之间交换32位整数 我有麻烦,因为当我尝试从Java客户端发送一些东西时,我在C++服务器上得到了java的随机回答。(例如,我发送了“0”,有一次我得到了一个数字,另一次我得到了不同的数字。我读过关于小端和大端编码的文章,但我认为这是另一个问题,因为发送“0”会产生与0不同的巨大值_Java_C++_Sockets - Fatal编程技术网

C和x2B之间的连接+;Socket与Java客户端 我在C++中创建了一个服务器应用程序,在java中创建了一个客户端应用程序。我想在它们之间交换32位整数 我有麻烦,因为当我尝试从Java客户端发送一些东西时,我在C++服务器上得到了java的随机回答。(例如,我发送了“0”,有一次我得到了一个数字,另一次我得到了不同的数字。我读过关于小端和大端编码的文章,但我认为这是另一个问题,因为发送“0”会产生与0不同的巨大值

C和x2B之间的连接+;Socket与Java客户端 我在C++中创建了一个服务器应用程序,在java中创建了一个客户端应用程序。我想在它们之间交换32位整数 我有麻烦,因为当我尝试从Java客户端发送一些东西时,我在C++服务器上得到了java的随机回答。(例如,我发送了“0”,有一次我得到了一个数字,另一次我得到了不同的数字。我读过关于小端和大端编码的文章,但我认为这是另一个问题,因为发送“0”会产生与0不同的巨大值,java,c++,sockets,Java,C++,Sockets,Java客户端: import java.io.DataOutputStream; import java.net.InetAddress; import java.net.Socket; public class Main { public static void main(String[] args) throws Exception{ Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),

Java客户端:

import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.Socket;


public class Main {
    public static void main(String[] args) throws Exception{
        Socket socket =  new 
Socket(InetAddress.getByName("127.0.0.1"),10000);
        DataOutputStream out = new DataOutputStream(socket.getOutputStream());

        out.writeInt(0);
    }
}
C++服务器:

#include <netinet/in.h>
#include <string>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <cerrno>
#include <cstring>
#include <iostream>

using namespace std;

int main(){


    int port = 10000;
    string ip_addr = "127.0.0.1";
    int domain = AF_INET;
    int type = SOCK_STREAM;
    int protocol = 0;

    int stopCondition = 0xFFFFFFFF;


    int socketHandle;
    struct sockaddr_in address;

    int clientSocketHandle;
    struct sockaddr_in clientAddress;
    size_t clientAddressSize;

    int buffer;


   if((socketHandle=socket(domain,type,protocol))<0)
        cout<<strerror(errno);

    address.sin_family = domain;
    inet_pton(domain,ip_addr.c_str(),&address.sin_addr);
    address.sin_port=htons(port);


    if((bind(socketHandle,(struct sockaddr *)&address,sizeof(address)))<0)
        cout<<strerror(errno);


    if (listen(socketHandle, 1) < 0)
        cout << strerror(errno);


    if ((clientSocketHandle = accept(socketHandle, (struct sockaddr *) &clientAddress, (socklen_t *) &clientAddressSize)) < 0)
        cout << strerror(errno);


    do {

        if (recv(clientSocketHandle, &buffer, sizeof(int), 0) > 0)
            cout<<buffer<<endl;

    } while (buffer != stopCondition);


    if(shutdown(clientSocketHandle,SHUT_RDWR)<0)
        cout<<strerror(errno);


    if(shutdown(socketHandle,SHUT_RDWR)<0)
        cout<<strerror(errno);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
int端口=10000;
字符串ip_addr=“127.0.0.1”;
int domain=AF_INET;
int type=SOCK\u流;
int协议=0;
int stopCondition=0xFFFFFFFF;
内特袜子;
地址中的结构sockaddr_;
int clientSocketHandle;
clientAddress中的结构sockaddr_;
大小\u t客户端地址大小;
int缓冲区;

if((socketHandle=socket(域、类型、协议))警告:
recv(clientSocketHandle,&buffer,sizeof(int),0)> 0 < /Cord>不能保证你得到所有你所要求的字节。不要只是测试<代码> ReV< <代码>失败的返回值。测试以确保你得到正确的字节数。<代码> MSGWAWITALWA/COM>可以帮助你。java,如果我正确记住,默认情况下发送整数大Endiad,而C++将在原生的Endia中发送整数。确保这些匹配。你绝对确定C++的实现使用了32位<代码> int <代码>吗?我建议使用<代码> INT32×T <代码>确保你的大小正确。@ USER481301非常感谢。我很感激。你是对的,问题是代码> MSGWAWITALWAL/<代码>。我没有使用它,而且我没有得到所有字节。eger是32位的,但现在我使用的是你建议的
int32_t
。@user4581301,我想再问一个问题。现在,如果我使用
MSG_WAITALL
我无法在循环中接收数据。我只能获取第一个数据,然后
recv
函数不会更改我的缓冲区。你知道如何处理它吗?没有好的答案。
recv(clientSocketHandle,&buffer,sizeof(buffer),MSG_WAITALL)
应该一直接收,直到奶牛回家。我的建议是,用一个好的方法解决你的问题,然后问一个新问题。警告:
recv(clientSocketHandle,&buffer,sizeof(int),0)> 0 < /Cord>不能保证你得到所有你所要求的字节。不要只是测试<代码> ReV< <代码>失败的返回值。测试以确保你得到正确的字节数。<代码> MSGWAWITALWA/COM>可以帮助你。java,如果我正确记住,默认情况下发送整数大Endiad,而C++将在原生的Endia中发送整数。确保这些匹配。你绝对确定C++的实现使用了32位<代码> int <代码>吗?我建议使用<代码> INT32×T <代码>确保你的大小正确。@ USER481301非常感谢。我很感激。你是对的,问题是代码> MSGWAWITALWAL/<代码>。我没有使用它,而且我没有得到所有字节。eger是32位的,但现在我使用的是你建议的
int32_t
。@user4581301,我想再问一个问题。现在,如果我使用
MSG_WAITALL
我无法在循环中接收数据。我只能获取第一个数据,然后
recv
函数不会更改我的缓冲区。你知道如何处理它吗?没有好的答案。
recv(clientSocketHandle,&buffer,sizeof(buffer),MSG_WAITALL)
应该一直接收,直到奶牛回家。我的建议是,用一个好的方法解决你的问题,然后问一个新问题。