C和x2B之间的连接+;Socket与Java客户端 我在C++中创建了一个服务器应用程序,在java中创建了一个客户端应用程序。我想在它们之间交换32位整数 我有麻烦,因为当我尝试从Java客户端发送一些东西时,我在C++服务器上得到了java的随机回答。(例如,我发送了“0”,有一次我得到了一个数字,另一次我得到了不同的数字。我读过关于小端和大端编码的文章,但我认为这是另一个问题,因为发送“0”会产生与0不同的巨大值
Java客户端: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"),
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)
应该一直接收,直到奶牛回家。我的建议是,用一个好的方法解决你的问题,然后问一个新问题。