gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:52:31 25 4
gpt4 key购买 nike

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

我的问题是结果不同。执行客户端的大约一半时间我得到正确的结果 (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()ing 0 字节表示连接已被另一方关闭。

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

另外^2:初始化变量(这里是intBuffer)是个好主意,至少在开发阶段,会说:在调整阶段之前。

关于java - 通过套接字从 Java 向 C 发送 int - 奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16117681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com