[英]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 long
和Java short
> C int
。
现在,这取决于您的优先级。
如果要使用Java执行大量数学计算并将结果通过套接字发送到C,建议您使用Java int -> C long
或
如果您只想发送小数字并使用C进行大量计算,请执行Java short
> C int
转换。
希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.